1

我正在使用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" );

它失败并出现此错误,说它找不到模块鼠标(我的模块包括):

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

有谁知道我如何做到这一点,以便我可以在我的 perl 目录中使用鼠标安装而不是安装系统范围的鼠标?我在运行时遇到了另一个模块的错误,dzil test该模块与Mouse. 我可以通过在系统范围内安装模块而不是在我的主目录中本地安装模块来解决这个问题perl5,但我更喜欢使用 Perlbrew 安装的鼠标,如果可能的话,不要弄乱我的系统 perl。我正在使用 Perlbrew 0.73 版。

4

1 回答 1

4

您正在尝试使用错误的方式安装它,perl因为您使用的dzil安装方式与perl您要使用的方式不同。

此外,您不应在perlbrewedperl中看到以下任何内容@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/(你的perlbrewedperl甚至没有线程!!!)

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

    1. 取消设置环境变量PERL5LIBPERLLIBPERL5OPT和. 永久。在您的登录脚本中删除它们,然后从当前 shell 中取消设置它们或重新登录。(记下它们作为备份的内容。)PERL_MM_OPTPERL_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_BASEPREFIXLIB

    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"
于 2015-06-03T17:06:18.717 回答