perlbrew失败,“找不到Devel / PatchPerl.pm”

时间:2013-04-19 21:03:31

标签: perl perlbrew

perlbrewCan't locate Devel/PatchPerl.pm失败。

更确切地说,失败的是由patchperl衍生出来的perlbrew

实际上是Devel/PatchPerl.pm通过在环境变量的路径访问PERL5LIB,但perlbrew无条件删除此变量在运行perlpatch之前:

delete $ENV{$_} for qw(PERL5LIB PERL5OPT);

我在perlbrew文档中找不到任何证明这种操作的文件。

有人能解释为什么perlbrew会这样做吗?

编辑:

下面是一个重现问题的bash脚本。我像这样运行它(有一些合适的<PATH_TO_SCRIPT>):

% env -i HOME=$HOME SHELL=/bin/bash /bin/bash --noprofile --norc
bash-3.2$ /bin/bash --norc --noprofile <PATH_TO_SCRIPT>

我的机器上脚本的运行时间约为4分钟。最后几行输出,包括显示错误的行如下:

(cd /tmp/perlbrew_root/build/perl-5.16.3 && rm -f config.sh Policy.sh && patchperl && sh Configure -de '-Dprefix=/tmp/perlbrew_root/perls/perl-5.16.3' '-A'eval:scriptdir=/tmp/perlbrew_root/perls/perl-5.16.3/bin'' && make  && make test_harness && make install) 2>&1 | tee /tmp/perlbrew_root/build.perl-5.16.3.log
Can't locate Devel/PatchPerl.pm in @INC (@INC contains: /Library/Perl/5.12/darwin-thread-multi-2level /Library/Perl/5.12 /Network/Library/Perl/5.12/darwin-thread-multi-2level /Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.3 /System/Library/Perl/5.12/darwin-thread-multi-2level /System/Library/Perl/5.12 /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level /System/Library/Perl/Extras/5.12 .) at /tmp/testperl/bin/patchperl line 12.
BEGIN failed--compilation aborted at /tmp/testperl/bin/patchperl line 12.
perl-5.16.3 is successfully installed.

上面输出的最后一行(perl-5.16.3 is successfully installed.)是无意义的:perl-5.16.3的真实构建和安装比这个脚本的运行时间长大约一个数量级,正如已经说明的那样,在我的机器上大约4分钟。

请注意错误中的@INC。鉴于patchperl,我看不到Devel/PatchPerl.pm如何找到/tmp/testperl/lib/perl5 @INC,{/ 1}}。

PERLDIR=/tmp/testperl
/bin/rm -rf "$PERLDIR"

/bin/rm -rf /tmp/build
/bin/mkdir -p /tmp/build
cd /tmp/build

/usr/bin/curl -s http://www.cpan.org/authors/id/A/AP/APEIRON/local-lib-1.008009.tar.gz | tar xzf -

pushd local-lib-1.008009
  /usr/bin/perl Makefile.PL "--bootstrap=$PERLDIR"
  /usr/bin/make install
popd

eval "$( /usr/bin/perl -I$PERLDIR/lib/perl5 -Mlocal::lib=$PERLDIR )"

/usr/bin/cpan App::cpanminus

export PERLBREW_ROOT=/tmp/perlbrew_root
export PERLBREW_HOME=/tmp/perlbrew_home
/bin/rm -rf "$PERLBREW_ROOT" "$PERLBREW_HOME"

$PERLDIR/bin/cpanm App::perlbrew
$PERLDIR/bin/perlbrew init
source "$PERLBREW_ROOT/etc/bashrc"

$PERLDIR/bin/perlbrew install -v perl-5.16.3

3 个答案:

答案 0 :(得分:2)

http://perlbrew.pl/升级perlbrew(perlbrew self-upgrade或shell bootstrap incantation。)

最新版本通过$PERLBREW_ROOT/bin将patchperl安装到perlbrew install-patchperl

答案 1 :(得分:0)

  

有人能解释为什么perlbrew会这样做吗?

Devel :: PatchPerl位于patchperl内。 perlbrew肯定会清除那些变量,这样你就不会意外地找到错误的模块(如果perlbrew没有清除那些模块那么你将会拥有它。)

如果安装perlbrew如果patchperl无法找到假设存在于patchperl内的代码,那么会出现问题!从头开始重新安装。

答案 2 :(得分:0)

在安装local::lib之后尝试完全(仅)安装perlbrew后,我遇到了这个问题。通过CPAN安装perlbrew时(不是唯一的方法,我之前使用curl -kL http://install.perlbrew.pl | bashlocal::lib已禁用),Devel::PatchPerl模块已正确安装到~/perl5/lib/perl5,但正如我们都发现的那样,perlbrew不会在那里看到。运行 perlbrew install-patchperl 将使用App::FatPacker构建的独立版patchperl安装到~/perl5/perlbrew/bin

这使我可以拥有一个本地&#34;系统&#34; perl,由local::lib提供的定制库和工具,用于普通和实验工作。但是我可以切换到使用perlbrew&#39; ed perl来处理特殊项目或应用程序,以获得更加可控的环境。真正的系统perl几乎从未被修改过。

警告 - 默认情况下,在.bashrc中启用local :: lib时,简单的perlbrew use perl-5.18.2不会删除local:lib特定的环境变量( PERL_MM_OPT和PERL_MM_OPT - 你必须自己做。一个(有点麻烦但很简单)的伎俩是:

perlbrew lib create perl-5.18.2@none  # do this once after brewing a perl
perlbrew use perl-5.18.2@none
perlbrew use perl-5.18.2

这也意味着,要关闭perlbrew,你可以这样做:

perlbrew off
eval $(perl -Mlocal::lib | grep -v PERL_LOCAL_LIB_ROOT)

您将返回默认的local :: lib设置。虽然最好关闭并重新打开新外壳,但要避免无限延长$PATH广告。

这是迄今为止我发现的最简单的方法来获得独立的自定义perl环境,包括使用默认(local :: lib)自定义的系统perl。