14

サーバーへの Perl モジュールのインストールを処理するために local::lib を使用しているので、システムのインストールを汚染することなく、一部の開発作業に適したバージョンを取得できます。

ただし、システム管理者が最近 Perl を 5.16 から 5.18 にアップグレードしたため、バイナリ モジュールに関連するエラーが発生しています。

perl -e 'use Scalar::Util'
Perl API version v5.16.0 of List::Util does not match v5.18.0 at /usr/lib64/perl5/5.18.2/XSLoader.pm line 92.
Compilation failed in require at /home/paul/perl5/lib/perl5/x86_64-linux/Scalar/Util.pm line 11.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

私の理解では、local::lib に強制的にすべてのモジュールを再構築させることで問題を解決できますが、これを行う方法や、すべてのモジュールのリストを取得する方法さえも説明しているドキュメントは見つかりません。 local::lib を使用してインストールされたモジュール (「1 行に 1 モジュール」のテキスト ファイルにある場合は、それを処理する Bash スクリプトを簡単に作成できます)。

これは可能ですか、それとも ~/perl5 ディレクトリを削除して、すべてのモジュールを最初から再インストールする必要がありますか?

4

2 に答える 2

7

更新: しばらくINSTALL_BASE前から、新しいインストールでこの問題を回避するためのより優れたディレクトリ構造が作成されています。

そして、それが install::lib で使用されるperl Makefile.PL INSTALL_BASE=...規則 (および対応するもの) がひどい理由です。Build.PL

削除する (またはディレクトリの名前を変更してバックアップを作成する) のが最も簡単な解決策です。ファイルを探すことで、インストールしたものを見つけることができ.pmます。

cd ~
mv perl5{,16}
cd perl516/lib/perl5
find -name '*.pm' | xargs perl -MConfig -E'
   for (@ARGV) {
      s!^\./!!;
      s!^5\.\d+\.\d+/!!;
      s!^x86_64-linux/!!;
      s!^auto/!!;
      s!\.pm\z!!;
      s!/!::!g;
      say;
   }
' | xargs cpan

(最初にドライラン| xargs cpan— 末尾のないもの — を実行します。)

管理者のアップグレードに翻弄されたくない場合は、 を使用perlbrewして Perl のビルド全体をホーム ディレクトリに簡単にインストールできます。

于 2014-09-02T13:47:19.103 に答える
3

を使用している場合は、およびスイッチを使用して、その場所cpanmでモジュールを強制的に再構築できます。local::lib-L--reinstall

list_modules | cpanm -L ~/perl5 --reinstall

wherelist_modulesは、モジュールの名前を にフィードするスクリプトです( へのオプションcpanmもあります)。このスクリプトは、上記の @ikegami のようなものか、(ただし、古いモジュールのみをリストする) のようなものです。これは、最近私にとってほとんどうまくいったハックな試みです(注:池上の方がおそらく優れています)-失敗した場合、またはスクリプトが認識しないモジュール名を指定した場合、続行し、何も壊していないようです(ただし、バックアップを作成します) ):-fcpanmcpan-outdatedcpanmcpanm

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。XS を使用するインストール済みモジュールの再構築を強制できるようにする内部 or がcpanあればいいのですが。そのようなことはありますか?cpanm_method-switchlocal::lib

それはcpanmcarton(そしてnode.jsツールnpmが実際に動作しているのを見て)、より多くのlocal::libベースのインストールを行うように促しました. 現在、perl ( ) に同梱されている CORE バンドルの「CPAN クライアント」もcpan、より自動化され、使いやすくなっているようです。local::libシステムを使用しながら、perlシステム レベルの特権なしで独自のモジュール スタックを管理できるので、私は本当に気に入っています。perlbrewただし、 「非システム」(「ローカル」) を実行する場合は、変更とアップグレードの管理が全体的に簡単になりますperl。もちろん、これを行うことができ、まだなどがあります。モジュールのディレクトリまたはアプリケーション固有のスタックを管理します。local::libcarton

1)。アップグレードを行う別の方法はperllocal、現在インストールされているモジュールのリストを生成するために使用することです ( NBperllocal.podが信頼できる/有用な状態に保たれているかどうかは完全にはわかりません)。[編集:実際には、現在インストールされているモジュールのリストではなく、インストールされているモジュールの履歴perllocalを保持します。これをフィルタリングするか、一連のモジュール バージョン全体を次々と再インストールすることになります!)。この perlmonks ノードは、 http : //www.perlmonks.org/? node_id=483020 をクリーンアップする方法を示しています。履歴を残すことを好みます。]perllocal.pod

perllocal.podへの入力を解析するにcpanmは、ファイルを検索して一致するものを配列に保存し、それらを 2 で分割して配列要素からハッシュを作成します ( 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 で言及したシェル スクリプトと比べると見劣りします。それは使用します -あなたが本当に持つ必要がjqあるコマンドラインユーティリティ(この後もっと欲しくなるでしょう)。モジュールのインストールに使用したことがある場合は、ファイルが作成されています。それを利用して、現在のモジュールのセットを再インストールするためにフィードするリストを作成できます。cpanminstall.jsoncpanm

 find ~/perl5/ -name install.json -exec jq '.name + "@" + .version' {} +

非常に高速で、非常にシンプルで、モジュールを再構築するために自己インストールcpanmを使用する方法と組み合わせることができます。curl

3)。perlbrewPerl インストールの管理に使用している場合は、すべてのモジュールをあるバージョンから別のバージョンに簡単にコピーして再インストールできます。perl

チッ!

于 2014-09-02T19:28:13.230 に答える