将 perl 脚本与其依赖项捆绑在一起?

Bundling up a perl script with its dependencies?

我有一个 perl 脚本,我将它放在一起进行一些监控和绘图。

它在我的开发系统上运行良好,我可以全权委托从 CPAN 安装我自己的模块。

我正在做的是将它捆绑起来部署到另一个系统上。但这里有一个问题 - 这个另一个系统是 'standalone' 并且没有网络连接。 (而且我有变更控制文件要填写,表明我正在安装什么)。

因此,我真的很想要一个很好的简单方法来弄清楚: - 我的脚本使用了哪些模块。 (包括依赖项) - 如何轻松抓住它们(可能 cpan get) - 有没有一种简单的方法可以告诉我正在使用什么 external 二进制文件? (我确定使用 sshrrdtool - 前者肯定已安装,后者可能未安装)。

我对如何做到这一点有一些想法,但我觉得应该更顺畅一些。

我可能还需要部署一个新的 perl,所以我在考虑我是否更好 'installing' 带有系统 perl 的模块(在 RHEL5 上可能是 5.8.8),或者只是 'packaging' 整个目录都在它自己的目录中,带有一个独立的 perl 实例。

使用 pp 将您的脚本和所有依赖模块和库打包到一个独立的可执行文件中。

pp -x yourscript.pl -o outputfilename

如有需要,请参阅文档以获取有关如何 link 外部共享对象(等)的示例。使用 pp 你不需要目标系统上的 perl,其中 outputfilename 将 运行.

当你有一个你无法控制 Perl 安装的系统(并且安装的是一个非常非常旧的 Perl 版本,比如 5.8.8,它缺少许多不错的改进,比如 state 变量, autodiesayswitch),您应该查看 Perlbrew

Perlbrew 允许您安装 Perl 的用户版本。 (实际上,它允许您安装多个版本的 Perl),并允许您在 Perlbrew 安装和正式安装版本之间切换。它使在 Perl 中做任何事情变得非常非常容易。

您将可以更自由地安装新的 Perl 模块,并且您可以自己完成该任务,而不是等待您的 IT 部门为您完成。

我最终在我们的一个系统上使用了它,其中原始版本的 Perl 无法完成我的 Perl 版本所做的事情。我本来要求我们的IT升级,但是他们真的把升级搞砸了。一来二去,索性问能不能安装Perlbrew

这是很重要的一点。总是请求许可。很多时候,IT 部门非常乐意效劳。他们不是 Perl 人,CPAN 是他们不想处理的世界。能够摆脱对安装这个或那个 Perl 模块的拜访和拜访是一种极大的解脱。

重新审视这一点,因为需求并没有真正消失。我已经转向使用 docker - 这是一个用于应用程序部署的 'image' 和 'container' 系统,除其他外,它允许您 'package' 一个应用程序。

您创建一个 Dockerfile - 类似于 Makefile - 运行安装 perl + 依赖项的步骤(通过包管理器,或从 CPAN) .

一旦完成,您就拥有了一个独立的、可运行的 'image',您可以克隆并创建一个实例(docker 用语 "container")。

它也非常有用 - 即使您不通过容器部署 - 找出这个 application/packages 的依赖项是什么。容器中的版本在本地安装了所需的一切,因为它是一个干净的构建。