7

我正在使用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 模块。

4

3 回答 3

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 网站上的技术重新安装所有模块,因为应该重建 XS 模块

如果您想重用和跟踪本地资源,最可靠的方法是创建本地 CPAN 镜像以使用App::lcpanminicpan. 如果您已经下载了源代码,使用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 应用程序的部署变得健壮和可靠:


编辑

perlbrewpintocarton和等工具cpanm是对用于执行类似操作的杂乱无章的个人脚本集合的巨大改进。感谢这些工具的所有开发人员和贡献者!

我不知道有任何功能cpanmperlbrew允许您可靠地生成已安装文件及其版本的列表。就像是:

 cpanm --list_installed
 perlbrew list_installed_versions

或者:

 cpanm --export-cpanfile
 perlbrew list_installed_as_cpanfile

可能是一个受欢迎的功能。

正如我在上面对 OP 的评论中指出的那样,您可以install.jsoncpanm. 类似的模块CPAN::MetaModule::MetadataDistribution::Metadata很有帮助。

使用findand的建议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} ) ;
} 
于 2015-03-12T16:13:55.067 回答
1

可能不是最好的方法,但这是我最近所做的。

我将我的 Perlbrewed Perl 版本提交给了一个 git repo,所以我可以用它git archive来为我创建一个 tar。我的Local::Lib模块也是如此。然后我写了一点脚本,以便我可以标记 master,从标记构建档案,将档案复制到远程服务器,解压缩和 chmod/chown 文件。

我这样做是因为当时这是一个快速而肮脏的解决方案,因为它没有时间设置 Pinto 或 Carton。

于 2015-03-12T17:21:04.360 回答
1

这只是解决方案的一部分,但到目前为止还想提到:Perl 的配置脚本从某些版本开始就有 -D relocateableinc 参数。当使用该选项构建/酿造 Perl 时,lib 路径不会是硬编码的绝对路径,而是相对于 perl 二进制文件,它允许您移动整个目录或只是重命名它。多年来,我一直在用这个选项构建我所有的 Perl,到目前为止它还没有造成任何问题。

于 2015-03-22T07:47:43.653 回答