我怎样才能卸载通过`cpan`安装的Perl模块?

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

我在互联网上search这个问题,并find了一些答案,但我发现的答案似乎要么讨论使用Perl包pipe理器(特定于Microsoft Windows),否则操作系统特定(BSDpan),build议使用cpanplus我有几个不好的经验),或者通过指向死链接结束,如下所示: http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules : http://www.cpan.org/misc/cpan-faq.html#How_delete_Perl_modules

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

你不能。 我的CPAN客户端没有这样的function。 在本周末的Perl QA Workshop上,我们正在讨论如何做类似这样的事情,但一般来说,以太提到的所有原因都很难。

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

很多时候,你可以简单的从A/B.pm删除A/B.pm文件(对于A::B模块) – 这至less会使模块不能使用。 大多数模块还包含一个要安装的文件列表(称为“清单”),所以如果你能find,你会知道你可以删除哪些文件。

但是,这些方法都不能解决作为依赖项安装的任何模块。 没有什么好的(自动的)方法可以知道其他东西是否依赖于这个模块,所以一旦你确定,你就必须手动卸载它。

卸载模块的困难是许多Perl开发人员正在使用版本控制系统来跟踪安装的一个原因 – 例如,参见brian d foy的文章,作为他即将出版的讨论使用git进行包pipe理的书的补充 。

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

  • PM-卸载
  • perlrocks

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

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

这应该工作。

2013年更新:此代码已过时。 赞成bsb迟来的答案 。


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

由于在安装任何模块的时候,主要是把相应的.pm文件放在各自的目录下。 所以,如果你只是为了一些testing的目的而删除模块,或者暂时最好的办法就是使用perldoc -l <MODULE>find存储模块的path,然后简单地将模块从那里移动到其他位置。 这种方法也可以作为一个更持久的解决scheme,但我不知道任何消极后果,因为我主要是为了testing。