4

我想与大约 10 个依赖项一起cpanm SomeModule安装SomeModule,但目标服务器无法访问 Internet。我确实有一台非常相似的开发机器(相同的 Perl 环境,相同的 Perl 版本)cpanm能够下载其源模块。

研究了man page之后cpanm,感觉可以在开发机上创建一个tarball,传到服务器,用它一口气安装模块。

不幸的是,我似乎没有找到它的确切组合。特别是,在开发机器上已经安装了模块,我需要强制它仍然将所有依赖项添加到 tarball(当然不包括核心模块)。

有人可以给出开发机器和目标机器的命令吗?

编辑:这是专门关于cpanm. 当然,如果您可以权威地说绝对不可能cpanm,那也将是一个有效的答案...

编辑:到目前为止的评论和答案建议使用pintominicpan创建一组 CPAN 模块源。这很好用(尤其pinto是用在这方面很简单)。我pinto现在用来解决我当前的问题,但是 Pinto 本身有很多必备模块(与 Perl-Core 相比>100)。我对这个问题的希望是cpanm,它是一个独立的、无需安装的脚本,可以自己完成(它具有广泛的选项,听起来他们可以朝那个方向发展)。这对于在没有大量开销的情况下引导 Perl 安装非常有用。

4

2 回答 2

4

您可以从 CPAN 或metacpan手动下载所有依赖项的 tar,然后复制它们并以正确的顺序一一安装。这对十个模块来说有点工作,但还不错。你可以写一个脚本。

但是您也可以使用minicpan创建一个仅包含您需要的内容的本地小型 CPAN。拥有部分或全部 CPAN 的本地副本非常棒,例如,当您在飞行中破解代码时需要安装模块时,在 USB 驱动器上。它本质上是一个包含更多目录和 tar 的目录。你可以选择你需要的东西,压缩它,把它移动到你的生产服务器,在那里解压,然后告诉cpanm从本地 CPAN 镜像安装。

于 2016-09-13T14:22:04.007 回答
3

您可以使用Carton在本地捆绑依赖项(在可以访问 Internet 的计算机上),然后使用 Carton 本身安装捆绑的发行版,或使用cpanm本身并指定捆绑位置。

您需要carton 1.0.32(用于生成包索引)和cpanm 1.7016(用于--from选项)才能正常工作。

在您的发行版的根目录中,您可以执行

$ carton install # will install the dependencies in `local`
$ carton bundle  # will cache the dependencies in `vendor`
$ tree vendor/
vendor/
└── cache
    ├── authors
    │   └── id
    │       └── F
    │           └── FO
    │               └── FOOBAR
    │                   ├── Some-Dist-1.337.tar.gz
    │                   └── Another-Dist-0.001001.tar.gz
    └── modules
        └── 02packages.details.txt.gz

稍后,将其转移到您的其他气隙机器后,您可以使用carton

$ carton install --cached
$ carton exec scripts/your-script.pl

cpanm或直接安装

# To emulate carton:
$ cpanm -L local --from "$PWD/vendor/cache" --installdeps --notest --quiet .
# Or to install globally:
$ cpanm --from "$PWD/vendor/cache" .
于 2019-11-15T14:56:49.297 回答