如何设置我的 Dockerfile 以使用 cpanm 安装特定版本的 Perl 模块?

How do I set up my Dockerfile to use cpanm to install a specific version of a Perl module?

在我的 Dockerfile 中,我正在设置将在 运行 时安装的 Perl 模块,如下所示:

RUN ["cpanm", "Carp", "Carp::Heavy", "Class::Data::Inheritable"]

但是,对于一个模块,我需要一个模块的特定版本,而不是最新版本。如何在上面的行中指定该版本?

我已经在线搜索了几个小时,但还没有找到任何有用的东西。

要让 CPAN 安装特定版本的模块,您需要提供完整的模块分发文件名,包括作者。例如要安装模块 Set::Object 版本 1.28,在命令行键入:

cpan SAMV/Set-Object-1.28.tar.gz

同样适用于 Docker,只需添加

RUN cpan SAMV/Set-Object-1.28.tar.gz

不指定模块名称,而是指定 URL。例如,使用 https://cpan.metacpan.org/authors/id/T/TM/TMTM/Class-Data-Inheritable-0.06.tar.gz

而不是 Class::Data::Inheritable

您可以找到适用的 URL,方法是转至 module page on metacpan,选择您想要的版本,然后复制下载 link。

PS:您可能还想在环境中设置 PERL_CPANM_OPT=--from https://cpan.metacpan.org/,以便 cpanm 仅使用 HTTPS.

下载

对于将来搜索相同答案的任何人,可以在 the documentation for cpanm 中找到另一个选项:

cpanm Plack@0.9990

如果您有很长的模块列表,请考虑将 cpanfile 填入 cpanm 而不是将它们全部列在 Dockerfile 中。

cpanfile 中为模块指定特定版本号的最简单方法如下:

requires 'Text::ParseWords', '==3.1';

请求模块最新版本的语法是这样的:

requires 'Text::ParseWords';

请求最低版本:(注意缺少'==')

requires 'Text::ParseWords', '3.1';

以其他方式请求特定版本的语法有很好的记录here

可以找到关于使用 cpanmcpanfile 的另一篇精彩文章 在 Installation of cpan modules by cpanm and cpanfile.