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

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

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

我的问题是,是否有一个干净的方式来删除通过 cpan安装的模块。

117595 次浏览

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

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

但是,这些方法都不会处理作为依赖项安装的任何模块。没有很好的(自动化的)方法可以知道是否有其他东西依赖于该模块,所以一旦确定后,还必须手动卸载该模块。

卸载模块的困难是许多 Perl 开发人员转向使用修订控制系统来跟踪安装的原因之一——例如,参见讨论使用 git 进行包管理的 作为他即将出版的新书的补充

你不能。我的 CPAN 客户机中没有这样做的特性。在本周末的 Perl QA 研讨会上,我们讨论了如何做到这一点,但是由于 Ether 提到的所有原因,这通常都很困难。

2013年更新: 此代码已过时。请更新 某人迟来的答复


我不需要经常卸载模块,但是基于 .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";
}

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

Packlist 显示样例模块删除代码 modrm

  1. 从 CPAN 安装 App::cpanminus(为此使用: cpan App::cpanminus)。
  2. 键入 cpanm --uninstall Module::Name(注意“ m”)卸载带有 cpanmin 的模块。

这个应该可以。

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