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


74

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

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

我的问题特别是是否存在一种干净的方法来删除通过安装的模块cpan


35
您真的想不出任何理由要从任何系统中删除任何Perl模块吗?

5
我一个,需要摆脱几个模块,所以我将有空间在我的2GB树莓派

8
@AmbroseChapel:一个明显的原因是测试代码,以检测最终用户在启动过程中是否安装了所需的Perl模块。我现在在哪。我想我必须运行一个干净的VM来运行该测试。
AlwaysLearning 2014年

4
@AmbroseChapel“为什么”不需要回答技术问题。
felwithe

2
还有另一个原因(即使原始注释似乎已删除)-您通过安装了一个模块cpan,然后发现它在分发包中可用。
Richlv

Answers:


45

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


Python与相同的问题setuptoolspip通过使用(或在安装时生成)包含文件列表的软件包元数据解决了该问题。
ivan_pozdeev

Python并不能真正解决这个问题。人们一直在谈论在Perl中执行相同的操作,但是由于模块可能无法使其元数据可用,因此它无法可靠地工作。
brian d foy 2015年

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

这应该工作。


看来,如果我输入要安装的OS X ,则App::cpanminus使用来安装该模块cpan App::cpanminus不会安装任何cpanm工具。我是否缺少某些东西cpanm --uninstall Module::Name-bash: cpanm: command not found
tonix

@tonix:检查其位置是否在您的中$PATH
reinierpost

这是一个老评论。你是说用find . -name '*cpanm' | grep -E 'cpanm'吗?
tonix

在Mac上,您无需使用find。使用聚光灯要快得多mdfind cpanm
Armand

1
使用Perl v5.22.1,我做到了sudo cpan install "DateTime::Format::Builder",一切正常,然后在以下目录中找不到cpanm --uninstall "DateTime::Format::Builder"并且无法将其卸载。分别是/usr/local/lib/x86_64-linux-gnu/perl/5.22.1/usr/local/share/perl/5.22.1。我安装cpanmsudo apt install cpanminus(v1.7040)。任何想法?
巴勃罗·比安奇

29

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

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

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

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


3
那不是书的摘录。这是在有效Perl编程中找不到的其他东西。
brian d foy 2010年

“没有良好的(自动)方式来知道是否有其他内容依赖于该模块” –为什么没有一种知道的方式?

1
@brian:抱歉,我误会了那个网站的性质!


18

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

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.