强制本地安装的模块使用本地安装的依赖项

时间:2013-03-21 19:15:28

标签: perl dependencies perl-module cpan dependency-management

我正在开发一个项目,需要将所有第三方(读取: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中的那个?

2 个答案:

答案 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;