使用带有dist zilla测试的perlbrew

时间:2015-06-03 16:40:55

标签: perl 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;

但即便如此,测试期间@INC中存在一些Perlbrew目录,例如

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

有谁知道我怎么做到这样我可以在我的perl目录中使用鼠标安装而不是安装系统范围的?我在运行dzil test时找不到另一个模块时出现上一个错误,该模块与Mouse位于同一目录中。我能够通过在我的家perl5目录中安装系统范围而不是本地模块来解决问题,但是我更喜欢使用Perlbrew安装的鼠标,如果可能的话,不要弄乱我的系统perl。我使用的是Perlbrew版本0.73。

1 个答案:

答案 0 :(得分:4)

您尝试使用错误的perl进行安装,因为您使用的dzil安装的perl与您要使用的perlbrew不同。 / p>

此外,您不应在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/
  • perlbrew
  • perl(您PERL5LIB ed PERLLIB甚至没有线程!)
  1. 让我们清理您的环境。

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

    2. 清除cpan配置项o conf makepl_arg # Just to see its current value as a backup. o conf makepl_arg '' o conf commit 。在INSTALL_BASE内,

      PREFIX

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

    3. 清除cpan配置项o conf mbuildpl_arg # Just to see its current value as a backup. o conf mbuildpl_arg '' o conf commit 。在--install_base内,

      --prefix

      特别是,我们要删除任何指示安装路径的内容,包括--libcpano conf build_dir_reuse 0 o conf commit

    4. 由于您在那里,请在cpan Dist::Zilla Mouse 内执行以下操作:

      which dzil

      这会将设置恢复为默认设置,如果更改了该设置,将会让您头疼。

  2. 安装依赖项。

    /Users/user/perl5/perlbrew/perls/perl-5.16.0/bin/dzil
    
  3. 此时,执行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" 再次尝试using(var once = new Once()) foreach(var it in new[]{1,2,3}) { once.Do(()=>Console.Write("It will write once and only once")) foreach(var it2 in new[]{4,5}) once.Do(()=>Console.Write("Inner loop will write 3 times and only 3 times: {0}", it)) } 。 (这不应该是必要的,但只是为了确定。)

    如果仍然没有,请提供以下命令的输出:

    public static void OnceAndAll<T>(this IEnumerable<T> source, Action<T> once, Action<T> all)
    {
      using(var en = source.GetEnumerator())
        if(en.MoveNext())
        {
          var current = en.Current;
          once(current);
          all(current);
          while(en.MoveNext())
            all(en.Current);
        }
    }
    public static void Once<T>(this IEnumerable<T> source, Action<T> once)
    {
      using(var en = source.GetEnumerator())
        if(en.MoveNext())
          once(en.Current);
    }
    //Overrides for where the value is not actually used:
    public static void OnceAndAll<T>(this IEnumerable<T> source, Action once, Action<T> all)
    {
      source.OnceAndAll(_ => once(), all);
    }
    public static void OnceAndAll<T>(this IEnumerable<T> source, Action<T> once, Action all)
    {
      source.OnceAndAll(once, _ => all());
    }
    public static void OnceAndAll<T>(this IEnumerable<T> source, Action once, Action all)
    {
      source.OnceAndAll(once, _ => all());
    }
    public static void Once<T>(this IEnumerable<T> source, Action once)
    {
      source.Once(_ => once());
    }