【问题标题】:Yum/apt-get before cpan to manage UNIX system-wide Perl modules?yum/apt-get 在 cpan 之前管理 UNIX 系统范围的 Perl 模块?
【发布时间】:2016-06-25 16:47:54
【问题描述】:

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::libPerlbrew

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

【问题讨论】:

  • 是的。在包管理系统上,如果包管理器提供了您需要的软件,我建议在做任何其他事情之前先使用它。
  • 您通常不应将软件包安装与 CPAN 安装混用。如果你想使用系统 perl,使用你的包管理器;否则,最好安装您自己的 perl 并使用 CPAN。
  • 这同样适用于基于 Debian 的系统(如 Ubuntu)上的 dpkg,尽管包命名方案不同。一个问题是,并非所有 CPAN 模块都将在您的操作系统的软件包存储库中可用(这就是为什么您需要 cpanm 作为后备)。
  • 别管您的供应商 Perl,而是使用 Perlbrew

标签: linux perl unix cpan yum


【解决方案1】:

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

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

【讨论】:

  • 我不完全同意“放在那里供你的系统使用”。是的,系统确实使用 Perl 和 Perl 模块,但最终所有这些包都可供所有人使用。我同意你不应该弄乱分发包提供的文件。
  • @GrantMcLean “可供所有人使用” 只要我们愿意使用发行版附带的普遍过时的 perl 版本,当然可以!就地更新它是危险的。这留下了本地安装的“生产”perl 的选项。或许我只是个控制狂……
【解决方案2】:

我不能从使用 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)。

请注意,在上面的开头段落中,我建议使用系统包“如果可以的话”。需要明确的是,我的意思是在您想要的大多数模块已经被 Debain 打包的情况下。上面的示例没有为任何依赖项构建包。如果您的应用程序涉及安装具有长依赖链且已不在 Debian 中的模块,则使用 cpanm 和 local::lib 将简化安装。但是当您的代码通过登台到生产服务器时,您将承担重复这一点的负担。您可能需要使用cpanfilecarton 来确保您在每一步都获得相同的版本。

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

unset PERL5LIB PERL_LOCAL_LIB_ROOT PERL_MB_OPT PERL_MM_OPT

【讨论】:

  • 授予,澄清一下,在系统范围内安装 apt-get 找不到的 CPAN 模块,您是否建议我下载并构建自己的并将其添加到本地存储库而不是依赖 @987654338 @找到并安装它?另外,请您举例说明您在 Debian 下用来完成此操作的命令示例吗?
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多