繁体   English   中英

PERL5LIB,@ INC和库优先级进行测试

[英]PERL5LIB, @INC and library priority for testing

.pl.pm use libunshift @INC时测试perl代码时,在覆盖perl lib时遇到一些困难,我的问题是:

在生产代码中use libunshift @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

除非没有其他选择,否则我不会硬编码路径。

通常,您不希望以其他方式对可以提供给程序的内容进行硬编码,以便它可以响应所处的任何环境,而不仅仅是对开发环境的响应。 这些环境之一可能是您的测试环境。

您可以从程序外部设置库搜索路径,这使其更加灵活。

而且,由于您对它们进行了硬编码并在运行时添加它们,因此它们将遵循您之前设置的所有内容。 在您的设置中会发生以下情况:

  • 您从默认的@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 /下可能有其他重要的目录,您尚未考虑。

我可能会误解您的问题,但是local::lib允许您“手动”调整模块路径。 您应该能够使用它来控制用于测试环境的路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM