卸载 cpan 安装的所有 perl 模块

Posted

技术标签:

【中文标题】卸载 cpan 安装的所有 perl 模块【英文标题】:Uninstall all perl modules installed by cpan 【发布时间】:2011-12-08 07:13:13 【问题描述】:

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

cpan -i Software

我没用过cpan,只知道是perl包管理器。 (是..?)然而,事实证明我需要大量的依赖项,而且我很愚蠢,我只是安装了所有的依赖项。 (首先,我必须设置 cpan 这问了我很多问题)长话短说,我只想再次删除所有它。我用谷歌搜索了一下,似乎 cpan 没有卸载例程,尤其是对于所有软件包。 我可以只删除一些目录还是会遇到麻烦?

【问题讨论】:

【参考方案1】:

cpan 命令并不是像apt-get 那样真正的包管理器。它更像是一种从 CPAN(站点或其镜像之一)下载和安装的工具。在完成这项任务后,它不会记得太多关于之前所做的事情,至少不足以删除以前安装的模块,至少不可靠、干净或依赖安全。 (更新:在查看 App::pmuninstall 之后,它可用于处理依赖项,但它通过连接到外部(阅读:网络)源来实现,这些源分别计算这些,这很好,但是我坚持之前的说法,即 CPAN.pm 不这样做。)

我以前担心删除模块,但现在我意识到大多数 Perl 模块占用的空间非常小,我只是不担心安装一些您永远不会使用的额外模块。因此,除非您使用的是带有非常小的光盘的计算机,否则我会任其发展。

在 Windows 上,或者如果您在 Linux/Mac 上使用非系统 Perl,您可以删除 Perl 并重新安装它。如果您使用的是在 Linux/Mac 上安装 Perl 的系统,我不建议这样做,但是这样做可能会破坏您的操作系统(如果您小心的话,您可能会没事,但不值得节省几 Mb!)。

将来,您可以使用perlbrew 轻松安装本地版本的 Perl,如果文档不充分(它们应该是),整个网络上都有教程。这还有一个好处,就是让您可以使用最新最好的 Perl 版本,而您的系统可能还没有提供这些版本。然后,如果您安装了大量垃圾,或者甚至以某种疯狂的方式破坏它,请删除该版本并重新安装/安装其他版本。

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

【讨论】:

感谢您的精彩解释。我深入挖掘了 lib 目录,并决定按照您的建议保留所有这些文件。 @xenoterracide 这是否取决于使用 cpanm 安装?粗略地看了一眼医生似乎暗示了这一点。无论哪种方式,至少从数据存储的角度来看,我认为不需要卸载 CPAN 上的几乎任何模块。仍然很高兴知道有些东西存在 不,cpanm afaik 没有做任何事情,只要写出 cpancpanp 做的东西。 酷+1!我注意到它确实会在网络上获取依赖关系,但鉴于 CPAN.pm 给它的限制,我很高兴他们找到了一些东西而不是忽略它们! 我只是看着这个并在想,卸载模块的一个原因是当您正在开发一个模块时,您在开发版本中删除了其中一个模块,但它仍然安装,因此在你的库。删除它是更好的主意。【参考方案2】:

您可以使用 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行应该是cpanm --uninstall "$module"【参考方案3】:

我不确定是否要删除“全部”。但是要删除单个模块,您可以使用 App::pmuninstall 及其唯一脚本 pm-uninstall 来卸载模块。然后,您也许可以编写某种脚本来递归删除这些依赖项。

【讨论】:

【参考方案4】:

如果由于路径中存在不兼容的模块而无法再使用 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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

这个建议的唯一问题是您不应该这样做,因为您在 Linux/Mac 上使用系统范围的安装。如果您使用的是 Windows,那么这实际上可能是首选。【参考方案6】:

我将更改 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

【讨论】:

以上是关于卸载 cpan 安装的所有 perl 模块的主要内容,如果未能解决你的问题,请参考以下文章

我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为啥?

安装Perl的CPAN模块

在 XAMPP for Windows 上从 CPAN 安装 perl 模块

如何在使用 perlbrew 时安装 CPAN 模块?

如何安装PAMIE模块

perl 下使用非root用户安装模块