卸载cpan安装的所有perl模块

时间:2011-10-15 10:35:19

标签: perl cpan

昨天我想测试一些软件,并在文档中说,要安装我只需要输入

cpan -i Software

我从未使用过cpan,我只知道它是perl包管理器。 (是吗??)然而,事实证明我需要大量的依赖项,而且像我一样愚蠢,我只是安装了所有这些依赖项。 (首先,我不得不设置cpan,问我很多问题)长话短说,我只想再删除所有这些。我google了一下,似乎cpan没有卸载例程,特别是对于所有的包一次。 我可以删除一些目录,还是会遇到麻烦?

6 个答案:

答案 0 :(得分:28)

cpan命令实际上不是apt-get之类的包管理器。它更像是一种从CPAN(网站或其中一个镜像)下载和安装的工具。完成此任务后,它不记得以前做过什么,至少不足以删除以前安装的模块,至少不可靠,干净或依赖安全。 (更新:在查看App::pmuninstall之后,它可以用来处理依赖关系,但它是通过连接到外部(读取:web)源来实现的,这些源分别计算这些,这很好,但我支持前面的说法,即CPAN.pm不会这样做。)

我曾经担心删除模块,但现在我意识到大多数Perl模块占用的空间很小,我只是不用担心安装一些你永远不会使用的额外模块。因此,除非您使用的是真正小碟片的计算机,否则我会放弃它。

在Windows上或者如果您在Linux / Mac上使用非系统Perl,您只需删除Perl并重新安装即可。如果您在Linux / Mac上使用系统安装Perl,我不建议这样做,因为您可能会破坏您的操作系统(如果您小心,可能没问题,但不值得保存一些Mb!)。

将来,您可以使用perlbrew轻松安装本地版本的Perl,如果文档不够(应该是),那么整个网络都有教程。这也有让你玩最新和最好的Perl版本的好处,你的系统可能还没有。然后,如果您安装了一大堆垃圾,或者甚至打破它做一些疯狂的事情,请删除该版本并重新安装/安装其他版本。

另一个不错的工具是cpanminus(或简称cpanm),它是一种更新,更友好的cpan工具。所有很酷的孩子都在使用它。

答案 1 :(得分:15)

您可以使用cpanplus(附带Perl)卸载单个模块,如下所示:

cpanp uninstall SQL::Abstract

您可以查看使用cpan脚本安装的所有模块,如下所示:

perldoc perllocal

把两者放在一起:

for module in $(perldoc -u perllocal | grep -F 'C<Module> L<' | sed 's/^.*L<\(.*\)|.*>$/\1/') ; do
    cpanp uninstall "$module"
done

答案 2 :(得分:2)

我不确定要删除“全部”。但是要删除单个模块,您可以使用App::pmuninstall使用它的唯一脚本pm-uninstall来卸载模块。然后,您可以编写某种脚本来递归删除deps。

答案 3 :(得分:1)

如果由于路径中存在不兼容的模块而无法再使用cpan,则可以手动删除所有已安装的模块。例如,我从Fedora 22升级到Fedora 23并且Perl版本发生了变化。以前通过cpanm安装到/usr/local/lib64/perl5的所有模块都不再起作用,阻止我使用cpanm。

$ cpanm --uninstall Apache::DBI
Attempt to reload Scalar/Util.pm aborted.
Compilation failed in require at /usr/share/perl5/vendor_perl/File/Temp.pm line 18.
...

我可以通过移动该目录来解决这个问题:

$ mv /usr/local/lib64/perl5 /root/usr-local-lib64-perl5

该目录的名称可能因系统而异。

Carefull:如果模块安装了该目录之外的文件,例如系统库文件,这些文件将保留在那里。

答案 4 :(得分:0)

我认为最好的选择是卸载Perl并重新安装。

答案 5 :(得分:0)

我将更改Flimm的答案以使用cpanm,并有选择地在脚本末尾卸载cpanm本身:

#!/usr/bin/env bash

for module in $(perldoc -u perllocal | grep -F 'C<Module> L<' | sed 's/^.*L<\(.*\)|.*>$/\1/' | sort | uniq) ; do
    if [[ "$module" =~ "App::cpanminus" ]]; then
        continue
    fi
    echo "Uninstalling $module..."
    yes | cpanm --uninstall "$module"
done

cpanm --uninstall App::cpanminus