我正在开发一个项目,需要将所有第三方(读取: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,但是一旦我将我的代码检查到存储库中,其他所有使用过时的Carps的人都会遇到同样的问题。那么我如何强迫Moose使用本地安装的Carp,而不是/usr/lib/perl5/5.8.8
中的那个?
答案 0 :(得分:5)
你不强迫驼鹿,你强迫perl
。您已将模块安装在perl
所不了解的位置,因此您需要告知perl
有关它的信息。
由于您希望影响所有脚本,因此您需要将其放入登录脚本中。
export PERL5LIB=/home/.../lib
如果您只想影响那个程序,可以使用以下方法启动该程序:
PERL5LIB=/home/.../lib script
或者您将以下内容添加到脚本中:
use lib '/home/.../lib';
答案 1 :(得分: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;