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

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

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

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

我一直在网上search几个小时,还没有发现任何有用的东西。

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

您可以通过访问metacpan上的模块页面 ,select所需的版本以及复制下载链接来find适用的URL。

PS:你也许还想在环境中设置PERL_CPANM_OPT=--from https://cpan.metacpan.org/ ,所以cpanm只能使用HTTPS下载。

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

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

同样的事情适用于Docker,只需添加

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

对于将来寻找同样答案的人,可以在cpanm的文档中find另一个选项:

 cpanm Plack@0.9990 

如果你有一个很长的模块列表,可以考虑把cpanfile放到cpanm而不是把它们全部列在Dockerfile中。

cpanfile为模块指定特定版本号的最简单的方法是这样的:

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

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

 requires 'Text::ParseWords'; 

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

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

以其他方式请求特定版本的语法在这里有相当详细的文档。

cpanmcpanfile 安装cpan模块中可以find使用cpanmcpanfile另一个很好的方法 。