我正在使用 perlbrew 。我在perlbrew perl-5.20.2
下安装了很多cpan模块。
有没有办法(或者最好的方法)进行perl-5.20.2的tarball安装以及我在perlbrew下安装的所有CPAN模块,以便我可以将它克隆到另一台机器上? / p>
我知道perlbrew download perl-5.20.2
但这似乎只是tarball perl-5.20.2而不是我安装的所有CPAN模块。
答案 0 :(得分:5)
使用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 website中的技术重新安装所有模块,因为XS模块应该重建等。
如果您想重复使用和跟踪本地来源,最可靠的方法是使用App::lcpan
或minicpan
创建本地CPAN镜像。如果您已经使用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/*
NB: 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
和jq
(来自@Ilmari Karonen Upgrade all modules installed by local::lib中的this answer)的建议导致了快速未完成的黑客攻击。一个挑战/问题是,有时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} ) ;
}
答案 1 :(得分:1)
可能不是最好的方式,但这是我最近做的。
我将Perlbrewed Perl版本提交到git仓库,因此我可以使用git archive
为我创建tar。与我的Local::Lib
模块类似。然后我编写了一些脚本,以便我可以标记master,从标记构建存档,将存档复制到远程服务器,解压缩并chmod / chown文件。
我这样做是因为当时没有时间设置Pinto或Carton是一个快速而又肮脏的解决方案。
答案 2 :(得分:1)
它只是解决方案的一部分,但希望到目前为止提到:Perl的配置脚本有一些-D relocateableinc参数,因为有些版本。 使用该选项构建/酿造Perl时,lib路径不会是硬编码的绝对路径,而是相对于perl二进制文件,它允许您移动整个目录或只是重命名它。 我多年来一直用这个选项构建我的所有Perl,到目前为止它还没有造成任何问题。