在.pl
或.pm
具有use lib
或unshift @INC
的情况下测试Perl代码时,在覆盖Perl库时遇到一些困难,我的问题是:
在生产代码中使用
use lib
或unshift @INC
是一个不好的主意,因为它们很难测试吗?prove -lvr
也无法覆盖它们。
代码test.pl
push @INC, '/push/inc/lowest_priority';
use lib "/top/priority/use/lib/second_priority";
unshift @INC, "/unshift/inc/lib/first_priority";
foreach my $inc (@INC){
print "INC=>$inc\n";
}
设置perl环境
export PERL5LIB=/export/PERL5LIB/env/lib:$PERL5LIB
perl -I/cmd/Iinclude/lib/ test.pl
的输出
INC=>/unshift/inc/lib/first_priority
INC=>/top/priority/use/lib/second_priority
INC=>/cmd/Iinclude/lib/
INC=>/export/PERL5LIB/env/lib
INC=>/usr/local/lib64/perl5
INC=>/usr/local/share/perl5
INC=>/usr/lib64/perl5/vendor_perl
INC=>/usr/share/perl5/vendor_perl
INC=>/usr/lib64/perl5
INC=>/usr/share/perl5
INC=>/push/inc/lowest_priority
答案 0 :(得分:3)
除非没有其他选择,否则我不会对路径进行硬编码。
通常,您不想以其他某种方式对可以提供给程序的内容进行硬编码,以便它可以响应所处的任何环境,而不仅是对开发环境的响应。这些环境之一就是您的测试环境。
您可以从程序外部设置库搜索路径,这使其更加灵活。
并且,由于您对它们进行了硬编码并在运行时将其添加,因此它们将在您之前设置的所有内容之后出现。这是您的设置中发生的情况:
@INC
开始。use lib
并立即执行该编译指示。现在/top/priority/use/lib/second_priority
在@INC
的开头。/top/priority/use/lib/second_priority
是@INC
中的第一件事。这就是随后的use
调用将在其中寻找内容的地方。push
并执行它。现在/push/inc/lowest_priority
是@INC
的最后一个元素。use lib
。unshift
并执行它。现在/unshift/inc/lib/first_priority
是@INC
中的第一项。require
调用(运行时功能)将首先在/unshift/inc/lib/first_priority
中出现。我不知道您期望在哪里找到期望加载的库,但是您必须提供它的完整路径。在 lib / 下可能还有其他重要的目录,您可能没有考虑。
答案 1 :(得分:1)
我可能会误解您的问题,但是local::lib
允许您“手动”调整模块路径。您应该能够使用它来控制用于测试环境的路径。