在没有CPAN网络访问的计算机上安装具有大量依赖关系的Perl模块

时间:2013-06-20 07:34:17

标签: perl cpan

我正在尝试在Linux服务器上安装DateTime机器。不幸的是,这个Linux服务器有一些限制的网络访问策略,阻止我直接使用CPAN shell下载内容或安装cpanminus。更改访问策略是我无法控制的,所以我正在寻找一种解决方法。我也没有root访问权限。

但是,我可以将任何内容下载到我工作的Window机器上,然后上传到此服务器上的文件共享。所以我开始逐个删除DateTime依赖项。我会下载一个模块,有时它会有Makefile.PL,有时它会有Build.PL。然后我将每个Build或Makefile重新绑定到我的INSTALL_BASE,测试每个模块。我做了大约20个模块,树木似乎扩展到更小的类,看不到尽头......

我希望你能告诉我一个更好的方法。有没有办法可以从具有所有DateTime依赖关系的CPAN访问权限(即我的Windows框)的机器下载到一个巨大的Perl包中,将其上传到Linux服务器,并在那里运行CPAN(无网络访问)把东西放在正确的地方?感谢。

4 个答案:

答案 0 :(得分:10)

到目前为止最有效的方法是在linux机器上创建一个minicpan,安装cpanm,并在这样的地方localcpanm别名:

alias localcpanm='cpanm --mirror file:///Users/Shared/cpan/ --mirror-only'

我在长途火车旅行中使用这种技术,网络访问不完整,并取得了巨大的成功。

答案 1 :(得分:8)

第一步是自动下载所有依赖项。您可以使用cpanm在联网的计算机上执行此操作:

cpanm -L /dev/null --save-dists dists --scandeps DateTime

这会生成一个依赖项列表,但更重要的是将它们下载到dists目录中。 -L /dev/null确保它不会关注已安装的模块。

dists复制到您的受限制的框中。

然后,在限制框上使用cpanm执行本地安装:

cpanm --mirror file:///path/to/dists -L foo DateTime

其中/path/to/distsdists目录的绝对路径。这会将内容安装到foo目录中。

答案 2 :(得分:1)

这个问题有一些解决方案,例如参见Carton,就像ruby的捆绑器,或者Pinto,它的目的是成为您自己的私有CPAN(据我所知)。

答案 3 :(得分:1)

我在工作中使用的一个解决方案是使用perlbrew开发服务器,一个Perl +模块和每个应用程序的应用程序,所有这些都在git repo中。 在生产机器上,只需部署应用程序并使用标签在版本之间切换,就可以访问git存储库。