我正在使用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。
答案 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
甚至没有线程!)让我们清理您的环境。
取消设置环境PERL5OPT
,PERL_MM_OPT
,PERL_MB_OPT
,cpan'
和makepl_arg
。永久性。在登录脚本中删除它们,然后从当前shell中取消它们或重新登录。(记下它们作为备份的内容。)
清除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
,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
,cpan
和o conf build_dir_reuse 0
o conf commit
。
由于您在那里,请在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"
再次尝试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());
}