【问题标题】:How do I install Perl modules on machines without an Internet connection?如何在没有 Internet 连接的机器上安装 Perl 模块?
【发布时间】:2010-12-24 19:19:46
【问题描述】:

我需要在未连接到 Internet 的联网机器上安装基于 Perl 的软件。因此,我想下载特定版本和/或最新版本的 Perl 模块,我还想知道这些模块是否需要安装过程。

背景:
出于安全原因,这些机器没有连接到互联网,这也被认为是不必要的。

我会将下载的模块放在我称为“安装服务器”的机器上,它包含我基于 Perl 的软件,还包含 Perl 模块的本地副本。

我将一台我想安装基于 Perl 的软件的机器称为“目标机器”,它也没有连接到互联网。可以有几台目标机器,每台机器都可以运行我要安装的这个软件。我登录到目标机器并运行一个安装脚本,该脚本将通过本地网络连接到安装机器,以获取基于 Perl 的软件和依赖的 Perl 模块并安装它们。

所以我需要知道:

  1. 如何/从何处获取特定版本的 Perl 模块,例如CGI.pm 等
  2. 如何安装这些 Perl 模块。是否只是将它们放在某个目录中,例如一个库路径,并确保该目录路径位于 @INC 库路径环境变量中(如果还没有的话)?

我不希望在安装模块时不必执行 make install 等任何操作。我想根据需要对模块进行预编译或准备,以便尽可能简单地安装它们。我想避免额外的依赖,比如 make 和它的配置,并且不得不解析它的输出来检查它是否成功。

请通过询问上述具体问题来帮助我,因为我无法更改未连接到互联网的“安装机器”和“目标机器”的概念 - 我必须提供一个适用于此的解决方案安排。

【问题讨论】:

    标签: perl download module installation local


    【解决方案1】:

    1) 如何/从何处获取特定版本的 Perl 模块,例如CGI.pm 等

    http://search.cpan.org/

    如果您不想要最新版本,可以通过点击面包屑中的链接获取早期版本。

    http://img.skitch.com/20091209-bu7kt3bj65374k7iijfnhrue2y.png

    2) 如何安装这些 Perl 模块。是否只是放置它们 在某个目录中,例如一个库路径并确保这个 目录路径在@INC 库路径环境变量中,如果 还没有?

    有时会起作用,但您确实应该通过perl Makefile.PL && make && make test && make install 流程。

    这样做需要您手动跟踪所有依赖项。使用minicpan 之类的东西可能会更好。

    【讨论】:

    • 您应该在答案中强调 minipan。这是解决这个问题的正确方法。
    • @David Dorward - 感谢您在我发布问题后很快回复。如原始问题中所述,我想避免 make install 等,因为它增加了复杂性,因为我必须手动查找依赖项,我必须确保 make 存在并且正常工作。如果有一个一致的、强大的自动化系统可以干净地处理制造的所有结果,我会很乐意遵循这个过程。
    • 如果必须使用 make 来提供预编译的模块以满足程序的依赖关系,那么将 Perl 称为可移植的解释语言似乎是不诚实的。进一步阅读后,我发现模块可能包含 C 代码,这可以解释为什么 make 是必要的。很遗憾,因为它确实为精确定义配置管理和安装过程增加了更多步骤。
    • Rob:对于许多简单的模块,将 .pm 文件复制到 @INC 目录的适当子目录中确实确​​实有效。但这种方法充满危险。
    • @Rob:Perl 是可移植的,但这并不能阻止人们用它创建不可移植的东西。 CPAN 只是第三方代码。
    【解决方案2】:

    解决“我想从 CPAN 安装东西但没有网络”问题的常用方法是使用 minicpan,正如 David Dorward 在他的回答中所写的那样。但是由于您要更进一步,说您根本不想在客户端(目标)机器上进行任何实际安装,并且如果可能的话您想使用预编译模块,我敦促您查看@987654321 @ 特别是PAR::Repository(服务器)和PAR::Repository::Client。

    由于这种方法在您掌握速度之前需要进行一些研究,因此对于“我只需要 Foo.pm”之类的问题,我不建议使用它。一旦您谈论的是少数依赖项和至少少数客户端,那么它就会成为更合适的解决方案。

    有关其工作原理的概述,请查看我在 YAPC::EU 2008 上的演讲中的slides。它还暗示了解决使 PAR::Repository::Client 模块在客户端(提示:PAR 可以生成自包含的可执行文件)。

    【讨论】:

    • 感谢 tsee 的回答。在这个阶段,本地 CPAN 镜像对我来说可能不是正确的解决方案,因为我有一个相当小的特定模块列表,我想获得这些模块来满足我的程序所具有的依赖关系。此外,我并不“拥有”本地 CPAN 所在的机器,因此在可用空间或安装我不需要的东西方面可能会受到限制。这个 PAR 解决方案本身似乎是一个模块,这似乎是一种先有鸡还是先有蛋的情况;我希望 PAR 模块本身易于获取、安装和运行以解决我的问题。
    • 感谢 tsee 提出的建议 - PAR - 本地 CPAN 镜像的替代方案。我会阅读它。
    • Rob:您可以使用 PAR(::Packer) 生成自包含的二进制可执行文件。
    • 我接受了这个答案,因为它涵盖了所有可能的解决方案,并对每个解决方案进行了评论。 PAR 听起来最符合我的需求,因为我想简化在多台机器上安装 Perl 模块的自动化。由于我支持的 Linux 发行版种类有限(即 Debian 5 x86 和 Mandriva x86),而且我想对使用的模块版本进行标准化,所以我可以设置一个安装本地服务器,其中包含预编译的模块来服务这些。
    【解决方案3】:

    您可以创建一个 MiniCPAN,其中包含来自 CPAN 的所有内容的最新版本。您可以使用CPAN::Mini::Inject 将其他非公共模块插入其中。如果您需要更好地控制版本(即不选择最新版本),您可能需要创建一个DPAN。

    使用这些解决方案中的任何一个,您都可以将 CPAN 客户端配置为从本地源中提取。这可能是您提前知道的目录,也可能是您动态计算的目录,例如 CD 或拇指驱动器。这只是正确设置配置的问题。

    您可能能够为大部分工作创建操作系统包,但这仍然意味着您必须至少在第一次编译它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2023-03-19
      • 2023-01-20
      • 1970-01-01
      • 2013-11-23
      • 2015-06-14
      • 2020-03-19
      • 1970-01-01
      相关资源
      最近更新 更多