如何打包我的 Perl 应用程序的依赖项以进行部署?

How can I package up my Perl app's dependencies for deployment?

我正在开发一个旨在使用 Module::Build 部署的 Perl 应用程序。我需要通过 CPAN 安装许多模块,因为它们无法通过 Ubuntu 的包管理器使用——或者更准确地说,我们所有服务器都使用的内部 apt-get 镜像。虽然这在我们的开发服务器上一切都很好,但 IT(可以理解)不愿意在没有缓存或内部控制的生产机器上运行代码。

由于我们目前没有 CPAN 镜像,这基本上意味着我需要将所有这些非 Ubuntu 模块放在一个地方,以便可以将它们存档 and/or 提交给版本控制。理想的解决方案是从源代码控制中检查实用程序,更改数据库的几个配置变量等,也许运行 build/install 命令,然后完成。幸运的是,开发服务器是生产服务器的克隆,因此使用 XS 或其他架构特定功能的模块应该不会造成问题。

我认为处理这个问题的最干净的方法是检查我需要的模块的源压缩包并设置 Module::Build 以使用这些来解决它的依赖关系而不是寻找 CPAN,但我没有看到选项。这是可行的,还是有另一种方法来收集我进行基本离线部署所需的所有模块?

如以上评论所述,Pinto 可能会满足您的需求,因为它会创建您自己的 CPAN 存储库。

Pinto has two primary goals. First, Pinto seeks to address the problem of instability in the CPAN mirrors. Distribution archives are constantly added and removed from the CPAN, so if you use it to build a system or application, you may not get the same result twice. Second, Pinto seeks to encourage developers to use the CPAN toolchain for building, testing, and dependency management of their own local software, even if they never plan to release it to the CPAN.

Pinto accomplishes these goals by providing tools for creating and managing your own custom repositories of distribution archives. These repositories can contain any distribution archives you like, and can be used with the standard CPAN toolchain. The tools also support various operations that enable you to deal with common problems that arise during the development process.


第二个回答

或者,如果您只打算部署到 Ubuntu,您可以将 CPAN 模块和您自己的模块转换为带有 dh-make-perl. You can then host them in your own repo with reprepro 的 Debian 软件包。这样做的好处是您可以更新软件包并执行

apt-get update
apt-get upgrade

在客户端计算机上,只要它们有您自己的存储库作为源

查看 Stratopan and Carton

另见:

  • Deploying Perl Application
  • How can I manage Perl module dependencies?

我不确定它有多常见,但我一直在使用 perlbrew and Pinto 来解决您正在谈论的一些问题。

  1. 使用 perlbrew,我没有与 "system" perl 交互。有一个应用程序 perl 和一个系统 perl,我没有安装更新版本的模块的风险,该模块以某种方式干扰了系统 perl 正在做的事情。

  2. 有了 Pinto,我已经存档了我知道可以使用的 CPAN 模块版本。

部署时,我构建了一个 perlbrew perl(使用 "prod" 之类的别名),然后使用 Pinto 存储库将所有必要的模块安装到该 perlbrew perl 中。我目前使用 cpan 包模块(该模块也进入 Pinto 存储库)来促进这一点,因此您只需从存储库安装包,它会自动将所有依赖项放入。