如果您正在使用,您可以使用和开关cpanm
强制它在您的位置重建模块:local::lib
-L
--reinstall
list_modules | cpanm -L ~/perl5 --reinstall
wherelist_modules
是一个提供模块名称的脚本cpanm
(还有一个-f
选项cpanm
)。这个脚本可能像上面的@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 ( ) 一起提供的 CORE 捆绑的“CPAN 客户端”cpan
似乎变得更加自动化并且更易于使用。我真的很喜欢local::lib
,因为它允许您使用系统perl
,但无需系统级权限即可管理您自己的模块堆栈。但是,如果您用于perlbrew
运行“非系统”(“本地”) ,则总体上可以更轻松地管理更改和升级perl
。当然你可以这样做并且仍然有local::lib
,carton
等等。管理目录或应用程序特定的模块堆栈。
1)。进行升级的另一种方法是使用perllocal
生成当前安装的模块的列表(注意我不完全确定是否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' {} +
非常快速,非常简单,您可以将其与使用自行安装的cpanm
方法相结合,以重建您的模块。curl
3)。如果您使用perlbrew
管理 perl 安装,您可以轻松地将所有模块从一个版本复制并重新安装perl
到另一个版本。
!