Perlbrew завершается ошибкой с "Не могу найти Devel/PatchPerl.pm"
perlbrew
не удается с Can'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
,
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 ответа
Обновление perlbrew (perlbrew self-upgrade
или заклинание начальной загрузки оболочки из http://perlbrew.pl/).
Последние версии устанавливают patchperl в $PERLBREW_ROOT/bin
через perlbrew install-patchperl
,
Я столкнулся с этим после попытки новой (только) установки perlbrew, после установки local::lib
, При установке perlbrew через CPAN (не единственным способом я пользовался 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, включая системный Perl с настройками по умолчанию (local::lib).
Может кто-нибудь объяснить, почему
perlbrew
Является ли это?
Devel:: PatchPerl находится внутри patchperl
, perlbrew
несомненно, очищает эти переменные, чтобы вы случайно не нашли неправильные модули (как это было бы для вас, если perlbrew
не очистил те).
Что-то не так, если ваша установка perlbrew
если patchperl
не могу найти код, который должен присутствовать в patchperl
сам! Переустановите его с нуля.