有没有办法在测试通过后在cpan安装期间运行perl代码?

时间:2017-05-22 20:09:50

标签: perl cpan

我有自己的cpan镜像,它有一些注入的模块仅供我们内部使用。我想在cpan安装期间运行一些perl代码。目前我正在将代码直接注入Makefile.PL,但问题是它是在" make test"之前运行的。我希望代码只在分发测试通过后运行。

一种选择是在最后一个测试文件的末尾注入代码,但是如何知道所有测试文件中的所有测试是否都已通过? Test :: More-> builder-> is_passing似乎只知道当前的测试文件。

2 个答案:

答案 0 :(得分:3)

就个人而言,我会使用元分发。说,Task :: MyCorp。然后,这将预先设置您想要的所有模块,并且具有额外的好处,即在所有先决条件都已成功测试之前,测试阶段将一直运行。

事实上,我经常有这样的元模块,就像common::sense,我可以在我想要的级别自动加载严格的警告,并导入我想要的任何其他功能(日志记录和翻译)两个大的)。在许多情况下,这将是一个方便的地方。

显然,如果不知道你是如何设置的,我无法确定这对你有用。没有一个通用的解决方案,所以如果这还不够,也许它会启动 在您的情况下工作的一些想法。

答案 1 :(得分:2)

一个选项(如果您使用ExtUtils::MakeMaker)是Makefile.PL中的define a MY::test function来(有条件地)添加额外任务。像

这样的东西
 # Makefile.PL
 ...
 sub MY::test {
    my $text = shift->SUPER::test(@_);  # original 'test' action for this system
    if ($ENV{BOOM}) {
        $text =~ s/^(test ::.*)$/$1 GO-BOOM/m;
        $text .= q~
GO-BOOM ::
    $(PERL) -E 'say "BOOM!"'
~;
    # note: important to use tab, not spaces, before "$(PERL) ..."
    }
    return $text;
 }

Makefile中,test操作现在看起来像

test :: $(TEST_TYPE) subdirs-test GO-BOOM
...
GO-BOOM ::
        $(PERL) -E 'say "BOOM!"'

test :: $(TEST_TYPE) subdirs-test

取决于Makefile.PL中发生的事情。 (这些是Makefile中的典型Linux规范。您的结果可能会有所不同。)

如果您在运行BOOM时定义了Makefile.PL环境变量,并且与make test相关的先前操作成功,则test操作也会执行GO-BOOM行动。GO-BOOM但如果测试失败,则$ BOOM=1 perl Makefile.PL $ make test TEST_FILES=t/test-that-will-pass.t PERL_DL_NONLAZY=1 "/usr/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/test-that-will-pass.t t/test-that-will-pass .. ok All tests successful. Files=1, Tests=16, 4 wallclock secs ( 0.01 usr 0.01 sys + 0.06 cusr 0.01 csys = 0.09 CPU) Result: PASS "/usr/bin/perl" -E 'say "BOOM!"' BOOM! $ make test TEST_FILES=t/test-that-will-fail.t PERL_DL_NONLAZY=1 "/usr/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/test-that-will-fail.t t/test-that-will-fail.t .. 1/? # Failed test at t/test-that-will-fail.t line 2. # Looks like you failed 1 test of 1. t/test-that-will-fail.t .. Dubious, test returned 1 (wstat 256, 0x100) Failed 1/1 subtests Test Summary Report ------------------- t/test-that-will-fail.t (Wstat: 256 Tests: 1 Failed: 1) Failed test: 1 Non-zero exit status: 1 Files=1, Tests=1, 0 wallclock secs ( 0.01 usr 0.01 sys + 0.03 cusr 0.00 csys = 0.05 CPU) Result: FAIL Failed 1/1 test programs. 1/1 subtests failed. Makefile:938: recipe for target 'test_dynamic' failed make: *** [test_dynamic] Error 1 将无法运行。

Enumerable.Range(1, 10).Select(n1 => Enumerable.Range(1, 10).Select(n2 => (n1, n2)))

(没有繁荣)