如何通过`cpan`卸载安装的Perl模块?

时间:2010-04-13 01:33:51

标签: perl module cpan

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

我在互联网上搜索了这个问题,并找到了一些答案,但我发现的答案似乎要么使用Perl软件包管理器(特定于Microsoft Windows)讨论,否则特定于操作系统(BSDpan),建议使用cpanplus(我有过几次糟糕的经历),或者通过指向死链接结束如下:http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules

我的问题是具体是否有一种干净的方法来删除通过cpan安装的模块。

6 个答案:

答案 0 :(得分:44)

  1. 从CPAN安装App::cpanminus(请使用:cpan App::cpanminus)。
  2. 键入cpanm --uninstall Module::Name(请注意“m”)以使用cpanminus卸载模块。
  3. 这应该有用。

答案 1 :(得分:38)

你做不到。我的CPAN客户端中没有功能可以执行此类操作。在本周末的Perl QA研讨会上,我们讨论的是如何做这样的事情,但是以太提到的所有原因通常很难。

答案 2 :(得分:29)

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

很多时候你可以简单地从你的perllib中删除A/B.pm文件(对于A::B模块) - 这至少会使模块无法使用。大多数模块还包含要安装的文件列表(称为“清单”),因此如果您能找到,您将知道可以删除哪些文件。

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

卸载模块的困难是许多Perl开发人员正在转向使用修订控制系统来跟踪安装的一个原因 - 例如请参阅讨论使用git进行包管理的article by brian d foy as a supplement to his upcoming book

答案 3 :(得分:23)

CPAN上有脚本试图卸载模块:

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

答案 4 :(得分:17)

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";
}

答案 5 :(得分:2)

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