perl – 如何从hg库中的已安装库中分离出来进行测试?

前端之家收集整理的这篇文章主要介绍了perl – 如何从hg库中的已安装库中分离出来进行测试?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我如何使用本地的hg repo库来测试与已安装的libs的隔离?

安装的生产perl包和本地hg repo具有相同的结构

+-- lib
        |-- modA.pm
        |-- modB.pm
    +-- bin
        |-- example.pl
    +-- t
        |-- modA.t
        |-- modB.t

安装的库和路径被添加到@ PERL5

/nfs_share/perl/
env|grep -i perl
PERL5:/usr/local/perl:/nfs_share/perl

本地hg回购:

/data/user/hg/perl

modB.pm

#!/usr/bin/perl
use modA;
sub modB_compare{
    my (x,y) = @_;
    # .....
    return x-y;
}

斌/ example.pl

use FindBin qw($Bin);
use lib "${Bin}/lib/";
use modA,modB;
# if this call is from local lib
my $result = modB_compare(x,y);
# if sub being called from production or local hg?
my $result2 = modA_method();
# from local hg repo or from production lib?!

如果我在本地的hg repo中进行修改和测试,那么我所调用的lib不是来自本地的repo,而是从生产库中获取的.

在本地hg回购中隔离库进行测试的潜在解决方案是什么?

解决方法

简短的答案:对于测试,只需使用 prove -l.

If I were to modify and test in local hg repo,there is no gurantee that the lib I called is from local repo,not from the production libs.

实际上,对于你定义的问题,

如果你知道./lib/modA.pm和./lib/在@INC中,那么./lib/modA.pm将被加载,并且任何系统perl版本将不会是*.

您的使用lib语句为您提供了perlvar @INCrequire中的记录.

但是,对于测试,通常的做法是不使用lib,而是使用-I flag in perl(perl -Ilib t / modA.t),或者更好的是,prove也有一个-l标志,所以你可以做证明-l它使用./lib中的模块来运行所有测试.

注意:您可能还想查看有助于分发任务的ExtUtils::MakeMakerModule::Build::Tiny,您可能需要考虑Dist::Zilla或(更快启动)Dist::Milla

如果您只想验证发生了什么您可以通过查看%INC来检查哪些文件已加载使用或需要声明.

如果您绝对必须控制哪些模块可访问,例如因为要根据是否安装第三方模块来测试不同的行为(而不是您自己的代码),我建议您查看perlbrew.这将帮助您编译自己的perl(几乎任何模糊的最近版本)不使用系统perl的库,而是使用自己的库,使用local :: lib;您可以在多个安装的perl之间切换.唯一的例外是使用perl打包的库;您可以从Module::Corelist获取这些清单.

最后,你可能想看看Carton.我不认为这是你所要求的,但这是一个类似的问题,我认为值得一提.

* OK,严格来说,lib必须在系统perl lib目录之前出现在@INC中,因为发生的是perl按顺序通过@INC,并找到与您要求加载的包名称相对应的文件;您在此答案中所使用的所有方法和我正在谈论的方法将确保您的lib目录早先出现在@INC中,然后是您的系统perl lib.

猜你在找的Perl相关文章