2

私はすべてのサードパーティ(読み取り:CPAN)のperlモジュールをPERFORCEリポジトリにインストールする必要があるプロジェクトに取り組んでいます。これにより、それらに依存するコードは、他の人が手動でインストールしなくても正常に実行できます。私はcpanminusを使用してCPANモジュールをインストールしているのでcpanm -L . Moose、目的のディレクトリで実行し、すべてが正常にインストールされました。ただし、Mooseで作成したモジュールをコンパイルしようとすると、次のエラーが発生することがあります。

Undefined subroutine &Carp::longmess_heavy called at /usr/lib/perl5/5.8.8/Carp.pm line 235.

CarpはMooseを使用してローカルディレクトリにインストールされていますが、の(古い)バージョンを使用しているようです/user/lib/perl5/5.8.8。自分のマシンでCarpをアップグレードすることはできますが、コードをリポジトリにチェックインするとすぐに、古いCarpを使用している他のすべての人が同じ問題に遭遇します。では、Mooseに、ローカルにインストールされているCarpではなく、ローカルにインストールされているCarpを使用させるにはどうすればよい/usr/lib/perl5/5.8.8ですか?

4

2 に答える 2

5

あなたはムースを強制しません、あなたは強制しperlます。モジュールをperl何も知らない場所にインストールしたので、それについて伝える必要がありますperl

すべてのスクリプトに影響を与えたいので、ログインスクリプトに配置する必要があります。

export PERL5LIB=/home/.../lib

その1つのプログラムにのみ影響を与えたい場合は、次を使用してプログラムを起動します。

PERL5LIB=/home/.../lib script

または、スクリプトに次を追加します。

use lib '/home/.../lib';
于 2013-03-21T19:20:27.763 に答える
0

私はなんとか解決策を見つけることができました。それは厄介ですが、それは私がすでに厄介なシステムを導入しているプロジェクトに参加するために支払わなければならない代償です。

Mooseを含める前に、新しいCarpを明示的に要求する必要があります。

require "[path to Carp]/Carp.pm";

これにより、サブルーチンの再定義に関する多くの警告が生成されたため、(一時的に)それらを抑制しなければなりませんでした。

my $restore_warn = $SIG{'__WARN__'};
$SIG{'__WARN__'} = sub {};
require "[path to Carp]/Carp.pm";
$SIG{'__WARN__'} = $restore_warn;
于 2013-03-22T18:54:31.097 に答える