有没有办法在测试通过后在 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
(没有繁荣)
我有自己的 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
(没有繁荣)