移动/克隆perlbrew安装的perl以及所有其他cpan模块

时间:2015-03-12 15:50:14

标签: perl cpan perlbrew

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

3 个答案:

答案 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::lcpanminicpan创建本地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应用程序部署稳健可靠:


修改

perlbrewpintocartoncpanm这样的工具,对于做类似事情的各种各样的脚本集合来说是一个巨大的进步。感谢这些工具的所有开发人员和贡献者!

我不知道cpanmperlbrew中允许您可靠地生成已安装文件列表的任何功能 他们的版本。类似的东西:

 cpanm --list_installed
 perlbrew list_installed_versions

或:

 cpanm --export-cpanfile
 perlbrew list_installed_as_cpanfile

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

正如我在上面对OP的评论中所指出的,您可以从install.json安装的cpanm文件中获取有关模块安装的有用信息。像CPAN::MetaModule::MetadataDistribution::Metadata这样的模块也很有帮助。

使用findjq(来自@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,到目前为止它还没有造成任何问题。