我有自己的cpan镜像,它有一些注入的模块仅供我们内部使用。我想在cpan安装期间运行一些perl代码。目前我正在将代码直接注入Makefile.PL,但问题是它是在" make test"之前运行的。我希望代码只在分发测试通过后运行。
一种选择是在最后一个测试文件的末尾注入代码,但是如何知道所有测试文件中的所有测试是否都已通过? Test :: More-> builder-> is_passing似乎只知道当前的测试文件。
答案 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)))
(没有繁荣)