Yum/apt-get 在 cpan 之前管理 UNIX 系统范围的 Perl 模块?
Yum/apt-get before cpan to manage UNIX system-wide Perl modules?
Perl 的 cpan
命令是管理 Perl 模块的强大方法。然而,在 UNIX 系统范围内维护模块时,Michal Ingeli 注意到另一个可能的选择是
yum install 'perl(PerlModuleName)'
。如果可用,yum 应该是我在这种情况下的首选吗?
例如,命令cpanm CGI
将CGI模块安装在我的~/perl5目录下,如果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
之前转向 yum
(如果可用)以进行系统范围的 UNIX Perl 模块管理?使用如下命令进行测试很容易:
yum install 'perl(LWP::Simple)'
如果在这种情况下 yum 失败,我会回退到:
cpanm -l <directory> LWP::Simple
在这种情况下你有什么建议,为什么?
(请注意 nxadm 已经回答了一个更一般的问题。)
到目前为止的答案总结:
如果可能,请使用系统包管理器更新 CPAN 模块。例如,对于 LWP::Simple:
yum install 'perl(LWP::Simple)'
,或
apt-get install liblwp-simple-perl
如果上述方法失败,请尝试实现一个单独的 Perl 环境,在该环境中使用系统范围库中不存在的 CPAN 模块。为此考虑local::lib or Perlbrew;
仅当上述选项不适用时,使用cpanm -l <directory>
将模块加载到系统范围的目录。
你的系统的 perl 被放在那里供你的系统使用。维护您的发行版的人会在他们认为适合您的系统需要的另一个版本时更新它。使用您系统的包管理器来管理它确实是您最好的主意。
尽管使用它,但如果您出于任何原因需要不同的版本,最好将自己的版本放到一个单独的位置。维护您自己的 perl 安装时,请使用 CPAN。
我无法从使用 RPM/yum 系统的经验谈起,但我在 Debian 系统上使用 Perl 应用程序做了很多工作,我 做 强烈建议去如果可以的话,使用 CPAN 模块的系统打包版本。我知道很多人不同意,从历史上看他们可能有充分的理由,但我已经做了很长时间并且发现它非常有效。
在 Debian 世界中,有大量预打包的 Perl 模块,如果您碰巧需要一个未打包的模块,您可以使用 dh-make-perl
构建自己的包并将其放入您本地的 apt 存储库。当您的代码通过 Dev -> Staging/UAT -> Production 工作流程移动时,能够 运行 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
)。
请注意,在我上面的开头段落中,我建议使用系统包 "if you can"。需要明确的是,我指的是 Debain 已经打包了您想要的大部分模块的情况。上面的示例没有为任何依赖项构建包。如果您的应用程序涉及安装具有 Debian 中没有的长依赖链的模块,那么使用 cpanm 和 local::lib 将简化安装。但是随着您的代码通过暂存到生产服务器前进,您将承担重复该操作的负担。您可能需要使用 cpanfile or carton 来确保您在每一步都获得相同的版本。
* 一个陷阱:如果您之前设置了 local::lib 以便 cpan 安装进入私有目录(例如:/home/user/perl5),那么这将影响 [=17] 中使用的路径名=] 由 dh-make-perl
制作。为避免这种情况,运行 this before dh-make-perl
:
unset PERL5LIB PERL_LOCAL_LIB_ROOT PERL_MB_OPT PERL_MM_OPT
Perl 的 cpan
命令是管理 Perl 模块的强大方法。然而,在 UNIX 系统范围内维护模块时,Michal Ingeli 注意到另一个可能的选择是
yum install 'perl(PerlModuleName)'
。如果可用,yum 应该是我在这种情况下的首选吗?
例如,命令cpanm CGI
将CGI模块安装在我的~/perl5目录下,如果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
之前转向 yum
(如果可用)以进行系统范围的 UNIX Perl 模块管理?使用如下命令进行测试很容易:
yum install 'perl(LWP::Simple)'
如果在这种情况下 yum 失败,我会回退到:
cpanm -l <directory> LWP::Simple
在这种情况下你有什么建议,为什么?
(请注意 nxadm 已经回答了一个更一般的问题。)
到目前为止的答案总结:
如果可能,请使用系统包管理器更新 CPAN 模块。例如,对于 LWP::Simple:
yum install 'perl(LWP::Simple)'
,或apt-get install liblwp-simple-perl
如果上述方法失败,请尝试实现一个单独的 Perl 环境,在该环境中使用系统范围库中不存在的 CPAN 模块。为此考虑local::lib or Perlbrew;
仅当上述选项不适用时,使用
cpanm -l <directory>
将模块加载到系统范围的目录。
你的系统的 perl 被放在那里供你的系统使用。维护您的发行版的人会在他们认为适合您的系统需要的另一个版本时更新它。使用您系统的包管理器来管理它确实是您最好的主意。
尽管使用它,但如果您出于任何原因需要不同的版本,最好将自己的版本放到一个单独的位置。维护您自己的 perl 安装时,请使用 CPAN。
我无法从使用 RPM/yum 系统的经验谈起,但我在 Debian 系统上使用 Perl 应用程序做了很多工作,我 做 强烈建议去如果可以的话,使用 CPAN 模块的系统打包版本。我知道很多人不同意,从历史上看他们可能有充分的理由,但我已经做了很长时间并且发现它非常有效。
在 Debian 世界中,有大量预打包的 Perl 模块,如果您碰巧需要一个未打包的模块,您可以使用 dh-make-perl
构建自己的包并将其放入您本地的 apt 存储库。当您的代码通过 Dev -> Staging/UAT -> Production 工作流程移动时,能够 运行 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
)。
请注意,在我上面的开头段落中,我建议使用系统包 "if you can"。需要明确的是,我指的是 Debain 已经打包了您想要的大部分模块的情况。上面的示例没有为任何依赖项构建包。如果您的应用程序涉及安装具有 Debian 中没有的长依赖链的模块,那么使用 cpanm 和 local::lib 将简化安装。但是随着您的代码通过暂存到生产服务器前进,您将承担重复该操作的负担。您可能需要使用 cpanfile or carton 来确保您在每一步都获得相同的版本。
* 一个陷阱:如果您之前设置了 local::lib 以便 cpan 安装进入私有目录(例如:/home/user/perl5),那么这将影响 [=17] 中使用的路径名=] 由 dh-make-perl
制作。为避免这种情况,运行 this before dh-make-perl
:
unset PERL5LIB PERL_LOCAL_LIB_ROOT PERL_MB_OPT PERL_MM_OPT