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

Is there a way to run perl code during cpan install after tests have passed?

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

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

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

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

显然,在不知道您如何设置所有内容的情况下,我无法确定这是否适合您。没有放之四海而皆准的解决方案,所以如果这还不够,也许它会引发一些想法,适用于您的情况。

一个选项(如果您正在使用 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 ::.*)$/ 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 规范。您的结果可能会有所不同)。

如果您在 运行 Makefile.PL 时定义了 BOOM 环境变量,并且如果与 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

(没有繁荣)