Как передать аргументы в тест Perl при запуске с использованием Module::Build

#perl #module-build

#perl #модуль-сборка

Вопрос:

Я создаю пакет Perl с использованием Module::Build. Тесты t /*.t для пакета должны использовать программу, находящуюся в каталоге, который пользователь должен указать во время вызова тестов:

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

Документация Module::Build предоставляет информацию о передаче аргументов в сценарий сборки, но я не нашел, как передать их в тест. Возможно ли это?

Комментарии:

1. Обычно используются переменные среды, пропуская тесты, если они не определены.

Ответ №1:

Обычно используются переменные среды. Это позволяет изменять поведение тестов без изменения сценария сборки.

 TEST_ALL_THE_THINGS=1 ./Build test
 

Ответ №2:

Поскольку невозможно установить переменную среды в той же командной строке в Windows, я решил изменить сборку.PL для передачи переменной среды в тесты путем создания подкласса Module::Build (добавление действия).

 # 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) amp;amp; $dir ne "" amp;amp; -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} .

Достаточно странно, что передается один и тот же аргумент командной строки, как $ARGV[1] в Linux, так $ARGV[2] и в Windows. У меня не было возможности протестировать его во FreeBSD и Mac OS X, но, надеюсь, он будет $ARGV[1] таким же, как в Linux.