如何在 运行 使用 Module::Build 时将参数传递给 Perl 测试
How to pass arguments to a Perl test when run using 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
由于无法在 Windows 中的同一命令行中设置环境变量,我决定更改 Build.PL 通过子类化 Module::Build 将环境变量传递给测试(Adding an action).
# 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
user-supplied-directory
作为 $ENV{HUSKYBINDIR}
传递给测试。
奇怪的是,相同的命令行参数在 Linux 中作为 $ARGV[1]
传递,在 Windows 中作为 $ARGV[2]
传递。我没有机会在 FreeBSD 和 Mac OS X 中测试它,但希望它会像 Linux.
中那样 $ARGV[1]
我正在使用 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 将环境变量传递给测试(Adding an action).
# 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
user-supplied-directory
作为 $ENV{HUSKYBINDIR}
传递给测试。
奇怪的是,相同的命令行参数在 Linux 中作为 $ARGV[1]
传递,在 Windows 中作为 $ARGV[2]
传递。我没有机会在 FreeBSD 和 Mac OS X 中测试它,但希望它会像 Linux.
$ARGV[1]