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

64 perl cpan module

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

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

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

小智 50

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

这应该工作.

  • 使用 Perl v5.22.1 我做了`sudo cpan install "DateTime::Format::Builder"`,一切正常,然后`cpanm --uninstall "DateTime::Format::Builder"` 我得到 _is not found in the following目录并且无法卸载_。它们是:`/usr/local/lib/x86_64-linux-gnu/perl/5.22.1`和`/usr/local/share/perl/5.22.1`。我用 `sudo apt install cpanminus` (v1.7040) 安装了 `cpanm`。任何的想法? (3认同)

bri*_*foy 39

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

  • 这真是难过;这真是伤心.:-( (71认同)

Eth*_*her 29

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

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

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

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

  • 这不是书中的摘录.这是你在Effective Perl Programming中找不到的额外东西. (3认同)

bsb*_*bsb 23

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

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

  • 我想真正的问题是:从Perl目录中删除它有什么不对吗? (2认同)

dax*_*xim 17

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";
}
Run Code Online (Sandbox Code Playgroud)