4

perlbrew失败Can't locate Devel/PatchPerl.pm

更准确地说,失败的是patchperlperlbrew.

实际上可以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

注意@INC错误中的。patchperl鉴于. _ Devel/PatchPerl.pm_ /tmp/testperl/lib/perl5_@INC

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
4

3 回答 3

2

升级 perlbrew(或来自http://perlbrew.pl/perlbrew self-upgrade的 shell bootstrap 咒语)。

最近的版本$PERLBREW_ROOT/bin通过perlbrew install-patchperl.

于 2013-04-19T21:13:55.843 回答
1

在安装local::lib. 通过 CPAN 安装 perlbrew 时(不是唯一的方法,我以前使用curl -kL http://install.perlbrew.pl | bash过,local::lib禁用了),Devel::PatchPerl模块已正确安装到~/perl5/lib/perl5,但正如我们都发现的那样,perlbrew不会在那里查看。运行perlbrew install-patchperl会将独立版本的 patchperl(内置App::FatPacker)安装到~/perl5/perlbrew/bin.

这允许我拥有一个本地“系统”perl,其中包含由 提供的定制库和工具local::lib,用于普通和实验性工作。但是对于特殊项目或应用程序,我可以切换到使用perlbrew'ed perl,以获得更加可控的环境。真正的系统 perl 几乎从未被修改过。

警告- 当 local::lib 在你的默认情况下启用时.bashrc,一个简单的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。

于 2014-12-08T22:16:51.810 回答
-1

有人可以解释为什么perlbrew会这样吗?

Devel::PatchPerl 位于patchperl. 肯定会清除这些变量,这样您就不会意外找到错误的模块(如果没有清除这些perlbrew模块,它会为您提供)。perlbrew

如果您安装的perlbrewifpatchperl找不到假定patchperl本身存在的代码,则会出现问题!从头开始重新安装它。

于 2013-04-21T08:37:27.130 回答