2016-07-26 38 views
6

在我的Dockerfile,我设立运行时将安装Perl模块,像这样:如何设置我的Dockerfile以使用cpanm来安装特定版本的Perl模块?

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

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

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

回答

6

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

您可以转到module page on metacpan,选择所需的版本并复制下载链接,以找到适用的URL。

PS:您可能还想在环境中设置PERL_CPANM_OPT=--from https://cpan.metacpan.org/,因此cpanm只能使用HTTPS下载。

+1

有关环境选项的好建议! – Mik

4

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

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

同样的事情适用与码头工人,只需添加

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

任何人谁是寻找在未来这个相同的答案,另一种选择可以在这里找到在the documentation for cpanm

cpanm [email protected] 

如果你有模块的一个长长的清单,考虑喂养cpanfilecpanm,而不是将它们全部列在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中找到 。

+1

非常好的总结(我将在稍后整理一下格式)。但是,请注意,在制作过程中,我想知道所有内容都来自哪里。为此,您可能希望保留自己的CPAN dist文件特定实例的存储库。另请参阅[CPAN :: Mini](https://metacpan.org/pod/CPAN::Mini)和[Pinto](https://metacpan.org/pod/Pinto)。 –

+1

谢谢。我看着平托,并决定这将是矫枉过正,因为我只是用它来旋转码头集装箱。 [Carton](https://metacpan.org/release/carton)是另一个需要考虑的工具,虽然它也使用cpanfile,而且我在查找工作语法时遇到了问题,以便在其中包含url而不是版本号cpanfile。 – Mik

+1

我不认为在cpanfile中有通过URL包含模块的语法。但是,您可以通过在环境中设置镜像并指定确切的版本来达到相同的效果。 –