将 perlbrew 与 dist zilla test 一起使用

use perlbrew with dist zilla test

我正在使用Dist::Zilla module to release and test my module. I am also using 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 和 运行s make test。这可能是因为测试需要旧版本的 perl 吗?像这样:

use 5.006;

但即便如此,在测试过程中 @INC 中仍然存在一些 Perlbrew 目录,例如

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

有谁知道我该怎么做才能在我的 perl 目录中使用鼠标安装而不是安装系统范围的鼠标?我以前有一个错误,当我 运行 dzil test 时无法找到另一个模块,并且该模块与 Mouse 在同一目录中。我能够通过在系统范围内安装模块而不是在我的主 perl5 目录中本地安装来解决这个问题,但我更愿意使用 Perlbrew 安装的鼠标,并且如果可能的话不要弄乱我的系统 perl。我正在使用 Perlbrew 版本 0.73。

您正在尝试使用错误的 perl 安装它,因为您使用的 dzil 是由不同于您要使用的 perl 安装的。

此外,您不应在 perlbrewed perl@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/(你 perlbrewed perl 甚至没有线程!!!)

  1. 让我们清理你的环境。

    1. 取消设置环境变量 PERL5LIBPERLLIBPERL5OPTPERL_MM_OPTPERL_MB_OPT。永久。在您的登录脚本中删除它们,然后从当前 shell 取消设置或重新登录。(记下它们作为备份。)

    2. 清除cpan's配置项makepl_arg。来自 cpan,

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

      特别是,我们要删除任何指示安装路径的内容,包括 INSTALL_BASEPREFIXLIB

    3. 清除cpan's配置项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"