代码之家  ›  专栏  ›  技术社区  ›  user181548

如何取消安装通过“cpan”安装的Perl模块?

  •  60
  • user181548  · 技术社区  · 16 年前

    我使用的是在用户空间中运行的Perl(不是通过根目录安装的),并通过命令行安装模块 cpan . 我想知道是否有一个简单的方法来删除一个模块,而不必做大量的工作删除单个文件。

    我在互联网上搜索了这个问题并找到了一些答案,但我找到的答案似乎要么是讨论使用Perl包管理器(特定于Microsoft Windows),要么是特定于操作系统(BSDPAN),建议使用cpanplus(我有过几次不好的经验),要么指向一个死链接,如下所示: http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules .

    我的问题是,是否有一种干净的方法来移除通过 CPAN .

    6 回复  |  直到 10 年前
        1
  •  40
  •   brian d foy    16 年前

    你不能。在我的CPAN客户机中没有一个功能可以做这样的事情。在这个周末的PerlQA研讨会上,我们讨论了如何做到这一点,但由于Ether提到的所有原因,这通常都很困难。

        2
  •  40
  •   G. Cito Marc    11 年前
    1. 安装 App::cpanminus 从CPAN(使用: cpan App::cpanminus 为此)。
    2. 类型 cpanm --uninstall Module::Name (注:” m “)卸载带有cpanminus的模块。

    这应该有效。

        3
  •  29
  •   Henk Langeveld    12 年前

    一般来说,CPAN模块没有特定的“卸载”机制。但你可以试试 make uninstall 在原始目录中,模块被解包到(通常在 /root/.cpan ~/.cpan ,因为有些包的安装脚本中确实包含此指令。(但是,由于您已将模块安装到本地(非根)库目录中,因此您还可以选择清除整个目录并重新安装您要保留的所有其他目录。)

    很多时候,你只需把 A/B.pm 文件(用于 A::B module)来自perllib——这至少会导致模块不可用。大多数模块还包含一个要安装的文件列表(称为“清单”),因此如果可以找到该列表,您就知道可以删除哪些文件。

    但是,这些方法都不能解决任何作为依赖项安装的模块。没有好的(自动的)方法来知道其他东西是否依赖于该模块,因此一旦确定了,您也必须手动卸载它。

    卸载模块的困难是许多Perl开发人员开始使用修订控制系统跟踪安装的原因之一——例如,请参见 article by brian d foy as a supplement to his upcoming book 讨论了使用Git进行包管理。

        4
  •  22
  •   daxim Fayland Lam    13 年前

    CPAN上有一些脚本尝试卸载模块:

    ExtUtils::Packlist 显示示例模块删除代码, modrm .

        5
  •  16
  •   Community Mohan Dere    9 年前

    更新2013:此代码已过时。上票 bsb's late-coming answer 相反。


    我不需要经常卸载模块,但是 .packlist 迄今为止,基于文件的方法从未让我失望过。

    use 5.010;
    use ExtUtils::Installed qw();
    use ExtUtils::Packlist qw();
    
    die "Usage: $0 Module::Name Module::Name\n" unless @ARGV;
    
    for my $mod (@ARGV) {
        my $inst = ExtUtils::Installed->new;
    
        foreach my $item (sort($inst->files($mod))) {
            say "removing $item";
            unlink $item or warn "could not remove $item: $!\n";
        }
    
        my $packfile = $inst->packlist($mod)->packlist_file;
        print "removing $packfile\n";
        unlink $packfile or warn "could not remove $packfile: $!\n";
    }
    
        6
  •  2
  •   shivams    11 年前

    因为在安装任何模块时,它主要将相应的.pm文件放在相应的目录中。 因此,如果您只想出于某种测试目的删除模块,或者暂时最好是使用 perldoc -l <MODULE> 然后简单地将模块从那里移动到其他位置。 这种方法也可以作为一种更持久的解决方案来尝试,但是我不知道任何负面的后果,因为我主要是为了测试。