perl - 如何与 hg repo 中已安装的库隔离以进行测试?

标签 perl

如何使用本地 hg repo 库来测试与已安装库的隔离?

安装的生产 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

本地 Mercurial repo 地址:
/data/user/hg/perl

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

bin/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 存储库中修改和测试,则无法保证我调用的库来自本地存储库,而不是来自生产库。

隔离库以在本地 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 版本都不会*。

您的 use lib声明为您执行此操作,如 perlvar @INC 中所述和 require .

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

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

如果您只是想验证发生了什么,您可以在 use 中查看已加载的文件。或 require通过查看 %INC 声明.

如果您绝对必须控制可以访问哪些模块,例如因为您想根据是否安装了第三方模块(而不是您自己的代码)来测试不同的行为,我建议查看 perlbrew .这将帮助您编译您自己的 perl(几乎所有模糊的最新版本),它不使用系统 perl 中的库,而是使用 local::lib 拥有自己的库。 ;然后您可以在多个已安装的 perls 之间切换。唯一的异常(exception)是与 perl 本身一起打包的库。您可以从 Module::Corelist 获取这些列表.

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

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

关于perl - 如何与 hg repo 中已安装的库隔离以进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531498/

相关文章:

perl - 使用 Net::SFTP 时如何注销

Perl Image::Resize 模块和 PNG 图像

regex - 是否应该一直使用原子组来加速失败?

visual-studio - Visual Studio 有 Perl 扩展吗?

linux - 使用 perl 检查 Linux 中的目录是否存在

perl - 是否有一些关于 Perl 网络编程的最新教程?

linux - 一个文件下有两个文件,pm和pl。如果运行pl文件,pm包调用不成功

sql-server - 使用 DBI 连接到 SQL Server

regex - 使用 perl 对行进行排序

perl - 我们如何在Perl中创建唯一ID