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

35g0bw71  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(279)

在我的Dockerfile中,我正在设置运行时将安装的Perl模块,如下所示:
RUN ["cpanm", "Carp", "Carp::Heavy", "Class::Data::Inheritable"]
但是,对于一个模块,我需要一个特定版本的模块,而不是最新的版本。我如何在上面的行中指定那个版本?
我在网上搜索了几个小时,还没有找到任何有用的东西。

wn9m85ua

wn9m85ua1#

指定URL而不是指定模块名称。例如,使用https://cpan.metacpan.org/authors/id/T/TM/TMTM/Class-Data-Inheritable-0.06.tar.gz而不是Class::Data::Inheritable
您可以转到module page on metacpan,选择所需的版本,然后复制下载链接,找到适用的URL。
PS:您可能还想在环境中设置PERL_CPANM_OPT=--from https://cpan.metacpan.org/,以便cpanm仅使用HTTPS下载。

relj7zay

relj7zay2#

对于将来寻找相同答案的人,可以在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中找到。

xt0899hw

xt0899hw3#

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

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

Docker也是如此,只需添加

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

7fhtutme4#

要指定可以使用的目标模块版本,请执行以下操作

cpanm MIYAGAWA/Plack-0.99_05.tar.gz              # full distribution path
cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz  # install from URL
cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz   # install from a local file

参见官方文档:https://metacpan.org/dist/App-cpanminus/view/bin/cpanm
但我认为使用cpanfile更好。请参阅--cpanfile选项https://metacpan.org/dist/App-cpanminus/view/bin/cpanm#-cpanfile和此文件的格式https://metacpan.org/pod/cpanfile
但是如果你有很多模块(像我一样),我推荐使用cpm。它并行安装模块非常快。而且在docker的帮助下,我们可以缓存构建,因此重建将花费几秒钟。下面是我的Dockerfile

## Modules
WORKDIR ${APP_ROOT}

# install modules outside of WORKDIR, so it will not interfere when we do COPY . .
RUN  mkdir -p ../modules
RUN  ln -s ../modules local

RUN  cpanm -n -L ./local App::cpm Carton::Snapshot  && rm -rf /root/.cpanm
COPY cpanfile ./
COPY cpanfile.snapshot ./
RUN  \
  --mount=type=cache,target=/root/.perl-cpm   \
  cpm install  -w 16  --no-test  -L ./local   \
  --with-develop

# regenerate cpanfile.snapshot
# https://github.com/miyagawa/Carmel#cpm
# cpm doesn't have the ability to manage cpanfile.snapshot file on its own.
RUN  carton install
# You can copy snapshot from container by running:
# docker cp <container_name>:${APP_ROOT}/cpanfile.snapshot.latest ./cpanfile.snapshot

相关问题