如果您使用的是cpanm,您可以使用-L 和--reinstall 开关强制它在您的local::lib 位置重建模块:
list_modules | cpanm -L ~/perl5 --reinstall
其中list_modules 是一个将模块名称提供给cpanm 的脚本(cpanm 也有一个-f 选项)。这个脚本可能像上面的@ikegami 或类似cpan-outdated 的东西(但是它只列出了过时的模块)。这里有一个
最近对我最有效的 hackish 尝试(注意:ikegami 的可能更好) - 当它失败或脚本给 cpanm 一个它无法识别的模块名称时,cpanm 继续运行并且似乎没有破坏任何东西(但要备份):
cd $PERL_LOCAL_LIB_ROOT
perl -MFile::Find -MConfig -E'
find {
wanted => sub {
$mod = $_ if /\.pm\z/;
$mod =~ s/lib\/perl5\/auto\/.*//g;
$mod =~ s/lib\/perl5\/\Q$Config{archname}\E\/.*//g;
$mod =~ s/lib\/perl5\///g;
push @mods, $mod unless $mod =~ /^$/;
},no_chdir=>1
},"lib/perl5"; @modhash{@mods}=(); say for sort keys %modhash '
通过更改File::Find 在wanted() 中找到的位置和内容,您可以将不同的模块列表提供给cpanm。如果cpan 或cpanm 有一个内部_method 或-switch 允许您强制重建local::lib 安装的使用XS 的模块,那就太好了。有这种事吗?
正是cpanm、carton(以及看到node.js 工具npm 的实际应用)启发了我进行更多基于local::lib 的安装。现在,与 perl (cpan) 一起提供的 CORE 捆绑“CPAN 客户端”似乎变得更加自动化并且更易于使用。我真的很喜欢local::lib,因为它允许您使用系统perl,但无需系统级权限即可管理您自己的模块堆栈。但是,如果您使用perlbrew 运行“非系统”(“本地”)perl,则总体上更容易管理更改和升级。当然你可以这样做并且仍然有local::lib、carton等。管理目录或应用程序特定的模块堆栈。
1)。另一种升级方法是使用perllocal 生成您当前安装的模块的列表(NB我不完全确定perllocal.pod 是否保持在可靠/有用的状态)。 [编辑:事实上,perllocal 保留了您已安装模块的历史,而不是当前已安装模块的列表。你会想要过滤这个,否则你最终会一个接一个地重新安装整个系列的模块版本!)。这个 perlmonks 节点展示了如何清理你的perllocal.pod:http://www.perlmonks.org/?node_id=483020。我更喜欢保留历史记录。]
要解析perllocal.pod 以获取cpanm 的输入,请搜索文件并将匹配项保存在一个数组中,然后将它们除以两个以从数组元素(key,value,key,value)中创建一个散列。文件中较新的安装和版本号较低,因此您可以创建一个以模块名称作为键的哈希,并由以后的条目更新值:
perl -ne 'push @arr, grep {defined}
(/\A=head2.*:\s+C<Module>\s+L<(.*)\||.*C<VERSION:\s(.*)>\Z/msx); }{
%h = map{ split/,/,$_,2 } @arr; print "$_\@$h{$_}\n" for keys %h' perllocal.pod
(注意:这不会错误检查 - perllocal.pod 中的条目偶尔会缺少 VERSION 数据和其他奇怪的东西,所以要小心。)
2)。 但是 与 ilmari 在 IRC 上的#perl-help 中提到的 shell 脚本相比,这种方法显得相形见绌。它用
jq - 你真正需要的命令行实用程序(在此之后你会更想要它)。如果您使用cpanm 安装模块,它将创建install.json 文件。您可以利用它来制作列表以提供给 cpanm 以重新安装您当前的模块集:
find ~/perl5/ -name install.json -exec jq '.name + "@" + .version' {} +
非常快速,非常简单,您可以将其与使用curl 的cpanm 方法结合使用以自行安装以重建您的模块。
3)。如果您使用perlbrew 来管理您的perl 安装,您可以easily copy and reinstall 您的所有模块从一个perl 版本到另一个版本。
HTH!