Использовать perlbrew с тестом dist zilla

Я использую модуль Dist:: Zilla для выпуска и тестирования моего модуля. Я также использую Perlbrew. Когда я запускаю скрипт с использованием perlbrew, который включает в себя мой модуль, скрипт работает нормально:

use strict;
use My::Module;

Однако всякий раз, когда я бегу dzil testна тесте, который просто пытается включить мой модуль:

#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;

plan tests => 1;

BEGIN {
    use_ok( 'My::Module' ) || print "Bail out!\n";
}

diag( "Testing My::Module $My::Module::VERSION, Perl $], $^X" );

Это терпит неудачу с этой ошибкой, говоря, что он не может найти модуль Mouse (который входит в мой модуль):

Error:  Can't locate Mouse.pm in @INC (you may need to install the Mouse module) (@INC contains:
/Users/user/github/My/Module/.build/HoKOnIQGYr/blib/lib
/Users/user/github/My/Module/.build/HoKOnIQGYr/blib/arch
/Users/user/perl5/lib/perl5/darwin-thread-multi-2level
/Users/user/perl5/lib/perl5/darwin-thread-multi-2level
/Users/user/perl5/lib/perl5
/opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/
/Users/user/perl5/lib/perl5/darwin-thread-multi-2level
/Users/user/perl5/lib/perl5
/opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/
/Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
/Library/Perl/Updates/5.18.2/darwin-thread-multi-2level
/Library/Perl/Updates/5.18.2
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18
/System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.18) at
/Users/user/github/My/Module/.build/HoKOnIQGYr/blib/lib/My/Module.pm line 4.

Он говорит, что не может найти Mouse.pm, который, как я знаю, находится по адресу

/Users/user/perl5/lib/perl5/darwin-2level

Я вижу, что по какой-то причине этот каталог не находится в @INC, что интересно, потому что, если я запускаю эту команду, чтобы распечатать все каталоги в @INC:

perl -e 'print "$_\n" for @INC'

Я получил:

/Users/user/perl5/lib/perl5/darwin-2level
/Users/user/perl5/lib/perl5
/opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/darwin-2level
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0/darwin-2level
/Users/user/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0
.

Поэтому, когда я запускаю Perl в командной строке, darwin-2level каталог присутствует в @INC, но всякий раз, когда я бегу dzil test это не. Это может не иметь большого отношения к Dist::Zillaя думаю Dist::Zilla просто создает Makefile.PL и работает make test для тебя. Может ли это быть потому, что для тестирования требуется более старая версия perl? Вот так:

use 5.006;

Но даже в этом случае некоторые Perlbrew каталоги присутствуют в @INC во время теста, такого как

/Users/user/perl5/lib/perl5/darwin-thread-multi-2level

Кто-нибудь знает, как я могу сделать так, чтобы я мог использовать установку Mouse в моем каталоге perl вместо установки общесистемной? У меня была предыдущая ошибка с другим модулем, который не мог быть найден при запуске dzil testи этот модуль был в том же каталоге, что и Mouse, Я смог решить проблему, установив модуль в масштабе всей системы, а не локально у себя дома. perl5 каталог, но я бы предпочел использовать мышь, установленную Perlbrew, и не связываться с моим системным perl, если это возможно. Я использую Perlbrew версии 0.73.

1 ответ

Решение

Вы пытаетесь установить его, используя неправильный perl так как вы используете dzil установлен другой perl чем тот, который вы хотите использовать.

Кроме того, вы не должны видеть ничего из следующего в вашем perlbrewиздание perl"s @INC:

  • /Users/user/perl5/lib/perl5/darwin-2level
  • /Users/user/perl5/lib/perl5
  • /opt/local/lib/perl5/vendor_perl/5.16.1/darwin-thread-multi-2level/ (Вы perlbrewиздание perl даже не с резьбой!!!)

  1. Давайте очистим вашу среду.

    1. Unset env vars PERL5LIB, PERLLIB, PERL5OPT, PERL_MM_OPT а также PERL_MB_OPT, Постоянно. Избавьтесь от них в сценариях входа в систему, затем удалите их из текущей оболочки или снова войдите в систему. (Запишите, какие они были в качестве резервной копии.)

    2. Очистить cpan'элемент конфигурации с makepl_arg, Изнутри cpan,

      o conf makepl_arg      # Just to see its current value as a backup.
      o conf makepl_arg ''
      o conf commit
      

      В частности, мы хотим удалить все, что указывает путь установки, в том числе INSTALL_BASE, PREFIX а также LIB,

    3. Очистить cpan'элемент конфигурации с mbuildpl_arg, Изнутри cpan,

      o conf mbuildpl_arg    # Just to see its current value as a backup.
      o conf mbuildpl_arg ''
      o conf commit
      

      В частности, мы хотим удалить все, что указывает путь установки, в том числе --install_base, --prefix а также --lib,

    4. Поскольку вы там, сделайте следующее изнутри cpan:

      o conf build_dir_reuse 0
      o conf commit
      

      Это восстановит настройку по умолчанию, что избавит вас от головной боли, если она была изменена.

  2. Установите зависимости.

    cpan Dist::Zilla Mouse
    

На этом этапе выполнения which dzil должен дать

/Users/user/perl5/perlbrew/perls/perl-5.16.0/bin/dzil

Если это так, вам следует идти.

Если нет, сделайте hash -r и попробовать which dzil снова. (Это не должно быть нужно, но просто чтобы быть уверенным.)

Если все еще нет, предоставьте выходные данные следующих команд:

echo "$PATH"
which cpan
head -n 3 "$( which cpan )"
echo 'o conf' | cpan | grep arg
which dzil
head -n 3 "$( which dzil )"
perl -V                           # Uppercase "V"
Другие вопросы по тегам