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,而不是 in 中的那个/usr/lib/perl5/5.8.8

4

2 回答 2

5

你不强迫 Moose,你强迫perl。您已将模块安装在一个perl不知道的位置,因此您需要告知perl它。

由于您想影响所有脚本,因此您需要放置在登录脚本中。

export PERL5LIB=/home/.../lib

如果您只想影响那个程序,您可以使用以下命令启动该程序:

PERL5LIB=/home/.../lib script

或者您将以下内容添加到您的脚本中:

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

I managed to find a solution. It's messy, but that's the price I have to pay for joining a project that already has a messy system in place.

Before including Moose, I have to explicitly required the new Carp:

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

This generated a lot of warnings about redefining subroutines, so I had to (temporarily) suppress them:

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