我正在使用perlbrew。我已经在perlbrew perl-5.20.2
.
有没有办法(或最好的方法)对我的 perl-5.20.2 以及我在 perlbrew 下安装的所有 CPAN 模块进行 tarball 安装,以便我可以将其克隆到另一台机器上?
我知道,perlbrew download perl-5.20.2
但这似乎只是 tarball perl-5.20.2 而不是我安装的所有 CPAN 模块。
使用 perlbrew,您可以使用该lib
命令创建一个local::lib
与您的 perlbrew perl 一起使用的命令。
perlbrew lib create perl-5.20.2@app_reqs
然后,如果一切顺利,当您安装模块时,您会在以下位置找到它们:
$HOME/.perlbrew/libs/perl-5.20.2@app_reqs
如果您不使用该perbrew lib create
方法来管理您的模块,那么它们将安装到$HOME/perl5/perlbrew/perls/perl-5.20.1/lib/site_perl/5.20.2
. 克隆这些目录中的任何一个都可能有效,但您最好使用perlbrew.pl 网站上的技术重新安装所有模块,因为应该重建 XS 模块等。
如果您想重用和跟踪本地资源,最可靠的方法是创建本地 CPAN 镜像以使用App::lcpan
或minicpan
. 如果您已经下载了源代码,使用cpanm
一种快速的 hackish 方法是找到源文件(在 下$HOME/.cpanm/
)并在您的 shell 中执行以下操作:
% mkdir ~/cpansourcefiles
% for source in ~/.cpanm/work/*/* ; do cp $source ~/cpansourcefiles ;done
然后,您可以cpanm
通过将文件名作为参数而不是模块名传递来使用这些源进行安装:
% cpanm ~/cpansourcefiles/List-MoreUtils-0.406.tar.gz
甚至:
% cpanm ~/cpansourcefiles/*
注意: YMMV 因为这很容易损坏,并且可能会跳过一些您通常使用的版本和依赖项检查,cpanm
但它比在工作时设置镜像更简单。
其他一些强大的工具可以使 Perl 应用程序的部署变得健壮和可靠:
编辑:
perlbrew
、pinto
、carton
和等工具cpanm
是对用于执行类似操作的杂乱无章的个人脚本集合的巨大改进。感谢这些工具的所有开发人员和贡献者!
我不知道有任何功能cpanm
或perlbrew
允许您可靠地生成已安装文件及其版本的列表。就像是:
cpanm --list_installed
perlbrew list_installed_versions
或者:
cpanm --export-cpanfile
perlbrew list_installed_as_cpanfile
可能是一个受欢迎的功能。
正如我在上面对 OP 的评论中指出的那样,您可以install.json
从cpanm
. 类似的模块CPAN::Meta
,Module::Metadata
也Distribution::Metadata
很有帮助。
使用find
and的建议jq
(来自@Ilmari Karonen,请参阅本答案中升级由 local::lib 安装的所有模块)导致下面的快速未完成的黑客攻击。一个挑战/问题是有时会在多个位置留下文件:install.json
lib/perl5/$Config{archname}/.meta/Whatever-Mod-1.0050000/install.json
lib/perl5/$Config{archname}/.meta/Whatever-Mod-1.0090000/install.json
这可能是因为在升级、重新安装或其他有关 PEBKAC 错误的问题时,这些文件并不总是被完全删除。为了正常工作,应该更改下面的代码,以便在有多个模块的名称-版本组合时注意到它install.json
,然后更彻底地检查模块是否已安装并获取其版本。脚本应该有选项:$dir
可能来自@ARGV
. TIMTOWTDI,“志愿服务”等。
#!perl
# list_installed_mods.pl
# DOES NOT THOROUGHLY VERIFY CURRENT VERSION
use File::Find;
use JSON;
use v5.16;
my $dir = "$ENV{HOME}/perl5/lib/perl5";
for my $installed ( find_installed($dir) ) {
say parse_install_json( $installed );
}
sub find_installed {
my $libdir = shift;
my @files;
File::Find::find ({ wanted =>
sub { push @files, $File::Find::name if /install\.json/i} },
$libdir );
return @files;
}
sub parse_install_json {
my $filename = shift;
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename)
or die("Can't open \$filename\": $!\n");
local $/;
<$json_fh>
};
my $install = decode_json($json_text) ;
return ( $install->{name} ,"\@", $install->{version} ) ;
}
可能不是最好的方法,但这是我最近所做的。
我将我的 Perlbrewed Perl 版本提交给了一个 git repo,所以我可以用它git archive
来为我创建一个 tar。我的Local::Lib
模块也是如此。然后我写了一点脚本,以便我可以标记 master,从标记构建档案,将档案复制到远程服务器,解压缩和 chmod/chown 文件。
我这样做是因为当时这是一个快速而肮脏的解决方案,因为它没有时间设置 Pinto 或 Carton。
这只是解决方案的一部分,但到目前为止还想提到:Perl 的配置脚本从某些版本开始就有 -D relocateableinc 参数。当使用该选项构建/酿造 Perl 时,lib 路径不会是硬编码的绝对路径,而是相对于 perl 二进制文件,它允许您移动整个目录或只是重命名它。多年来,我一直在用这个选项构建我所有的 Perl,到目前为止它还没有造成任何问题。