82

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

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

我的问题特别是是否有一种干净的方法来删除通过cpan.

4

6 回答 6

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

这应该有效。

于 2015-04-06T09:23:21.733 回答
47

你不能。我的 CPAN 客户端中没有功能可以做这样的事情。在本周末的 Perl QA 研讨会上,我们讨论了如何做类似的事情,但由于 Ether 提到的所有原因,这通常很难。

于 2010-04-13T06:50:49.163 回答
31

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

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

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

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

于 2010-04-13T02:09:49.863 回答
25

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

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

于 2012-06-25T04:50:41.197 回答
19

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";
}
于 2010-04-13T08:04:51.200 回答
2

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

于 2015-05-21T05:44:09.673 回答