Yum/apt-get 在 cpan 之前管理 UNIX 系统范围的 Perl 模块



Perl 的 cpan 命令是管理 Perl 模块的强大方法。 但是,在UNIX下维护整个系统的模块时,Michal Ingeli指出,另一种可能的选择是 yum install 'perl(PerlModuleName)' . 如果有的话,在这种情况下,yum 应该是我的首选手段吗?

例如,命令cpanm CGI在我的 ~/perl5 目录下安装 CGI 模块,如果 CGI 模块仅在我的帐户下运行的脚本需要,这可能是最好的。 但这不会为其他帐户运行的脚本提供 CGI 模块。

我可以使用cpanm -l <directory>强制cpanm命令将模块加载到特定目录(例如,cpanm -l /usr/local CGI将 CGI 安装到/usr/local/lib/perl5),或者我可以编辑~/cpan/CPAN/MyConfig.pm更改cpan使用的默认安装位置。

但是在几乎所有系统上,都存在多个Perl系统库位置(/usr/local/share/perl5,/usr/share/perl5/vendor_perl,/usr/lib64/perl5等),选择正确的位置有点武断,因为这些不是由cpan命令生成的。

考虑到这一点,我是否应该在cpan系统范围的 UNIX Perl 模块管理之前求助于 yum(如果可用)? 使用以下命令进行测试非常简单:

yum install 'perl(LWP::Simple)'

如果 yum 在这种情况下失败了,我会回退到:

cpanm -l <directory> LWP::Simple

在这种情况下,您有什么建议,为什么?

(请注意,nxadm 已经回答了一个更普遍的问题。


总结到目前为止的答案:

  • 如果可能,请使用系统包管理器更新 CPAN 模块。 例如,对于 LWP::简单:

    • yum install 'perl(LWP::Simple)'

    • apt-get install liblwp-simple-perl

  • 如果上述方法失败,请尝试实现一个单独的 Perl 环境,在该环境中使用系统范围库中不存在的 CPAN 模块。 考虑 local::libPerlbrew 来做这个;

  • 仅当上述选项不适用时,才使用 cpanm -l <directory> 将模块加载到系统范围的目录。

我不能从 RPM/yum 系统的经验来说话,但我在 Debian 系统上使用 Perl 应用程序做了很多工作,如果可以的话,我强烈建议你使用 CPAN 模块的系统打包版本。 我知道很多人不同意,从历史上看,他们可能有充分的理由,但我已经这样做了很长时间,发现它效果很好。

在 Debian 世界中,有大量的预打包形式的 Perl 模块,如果你碰巧需要一个没有打包的模块,你可以用 dh-make-perl 构建自己的软件包,并将其放在本地的 apt 仓库中。 当您的代码在 Dev -> 暂存/UAT -> 生产工作流中移动时,能够运行 apt-get install your-application 并让它拉入所有必需的依赖项可以真正节省时间。 它还使你确信要部署到生产环境的特定模块的版本与在 UAT 中测试的版本相同。

您绝对不应该做的一件事是使用 cpanm 或 cpan shell 作为 root 将模块安装到系统目录中。 如果您决定直接从 CPAN 安装,请使用 local::lib 将模块安装在特定于应用程序的 lib 目录中。

[编辑] 根据要求执行一些示例命令:

在基于 Debian 的系统上,您将首先安装 dh-make-perl 工具:

sudo apt-get-install dh-make-perl

然后,要从 CPAN 下载软件包并将其构建到 .deb 文件中,您将运行如下命令*:

dh-make-perl --build --cpan Algorithm::CouponCode

您可以使用以下命令安装生成的.deb文件:

sudo dpkg -i libalgorithm-couponcode-perl_1.005-1_all.deb

管理您自己的 apt 存储库是另一个主题。 就我而言,我会将.deb复制到本地 apt 服务器上的适当目录并运行脚本来更新索引(我认为我们的脚本使用 dpkg-scanpackages )。

请注意,在上面的开头段落中,我建议"如果可以的话"使用系统包。 需要明确的是,我的意思是,在您想要的大多数模块已经被 Debain 打包的情况下。上面的示例没有为任何依赖项生成包。如果您的应用程序涉及安装具有 Debian 中尚未存在的长依赖链的模块,那么使用 cpanm 和 local::lib 将简化安装。 但是,随着代码通过过渡到生产服务器,您承担了重复此操作的负担。您可能需要使用 cpanfile 或 carton 来确保您在每一步都获得相同的版本。

* 一个问题:如果您之前设置了 local::lib,以便 CPAN 安装进入私有目录(例如:/home/user/perl5),那么这将影响 dh-make-perl 生成的.deb中使用的路径名。 为避免这种情况,请在dh-make-perl之前运行以下命令:

unset PERL5LIB PERL_LOCAL_LIB_ROOT PERL_MB_OPT PERL_MM_OPT

你系统的perl被放在那里供你的系统使用。 维护您的发行版的人将在他们认为适合适合您系统需求的另一个版本时对其进行更新。 使用系统的包管理器来管理它确实是您最好的主意。

随意使用它,但如果您需要不同的版本,无论出于何种原因,您最好将自己的版本滚动到一个单独的位置。 在维护自己的 perl 安装时,请使用 CPAN。

最新更新