如何在使用Module::Build运行时向Perl测试传递参数

如何在使用Module::Build运行时向Perl测试传递参数,perl,module-build,Perl,Module Build,我正在使用Module::Build构建一个Perl包。包的测试t/*.t必须使用驻留在目录中的程序,用户应在调用测试期间提供该目录: perl Build.PL ./Build ./Build test user-supplied-directory Module::Build文档提供了有关将参数传递给构建脚本的信息,但我还没有找到如何将参数传递给测试。可能吗?通常使用环境变量。这允许在不改变构建脚本的情况下更改测试的行为 TEST_ALL_THE_THINGS=1 ./Build test

我正在使用Module::Build构建一个Perl包。包的测试t/*.t必须使用驻留在目录中的程序,用户应在调用测试期间提供该目录:

perl Build.PL
./Build
./Build test user-supplied-directory

Module::Build文档提供了有关将参数传递给构建脚本的信息,但我还没有找到如何将参数传递给测试。可能吗?

通常使用环境变量。这允许在不改变构建脚本的情况下更改测试的行为

TEST_ALL_THE_THINGS=1 ./Build test

由于无法在Windows中的同一命令行中设置环境变量,因此我决定更改Build.PL,通过子类化Module::Build()将环境变量传递给测试

用户提供的目录
作为
$ENV{HUSKYBINDIR}
传递给测试


奇怪的是,相同的命令行参数在Linux中作为
$ARGV[1]
传递,在Windows中作为
$ARGV[2]
传递。我没有机会在FreeBSD和Mac OS X中测试它,但希望它能像在Linux中一样
$ARGV[1]

人们通常使用env vars,如果没有定义,就跳过测试。
# Build.PL
use Module::Build;
use strict;
use warnings;

my $class = Module::Build->subclass(
    class => "Module::Build::Husky",
    code => <<'SUBCLASS' );

sub ACTION_test
{
    my $self = shift;
    my $dir = ($^O =~ /Win/) ? $ARGV[2] : $ARGV[1];
    $ENV{HUSKYBINDIR} = $dir if(defined($dir) && $dir ne "" && -d $dir);
    $self->SUPER::ACTION_test;
}
SUBCLASS

my $build = $class->new
(
    ...
);
$build->create_build_script;
Build test user-supplied-directory