perlbrew и local::lib одновременно?
До сих пор я использовал системный perl (в Ubuntu 10.10) и использовал local::lib для установки модулей CPAN в свой личный каталог ~/perl5
Поскольку я пытаюсь использовать perlbrew, кажется, что они не знают друг о друге. Я установил perl-5.12.3 с помощью perlbrew, но когда я переключаюсь на него с использованием perlbrew, использую perl-5.12.3, я все еще вижу PERL5LIB и PERL_MM_OPT, установленные local::lib.
Это не хорошо:
$ cpan XML::Simple
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/perl: symbol lookup error: /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Cwd/Cwd.so: undefined symbol: Perl_Gthr_key_ptr
в то время как
$ which cpan
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan
поэтому он использует правильную версию клиента cpan, но благодаря переменной окружения PERL5LIB он забирает модули из неправильного места.
Есть ли в perlbrew какой-либо режим совместимости или мне нужно вручную отключить PERL5LIB и PERL_MM_OPT?
5 ответов
С тех пор, как я начал использовать perlbrew, я перестал использовать local::lib для использования в оболочке, потому что теперь, когда у меня есть собственный perl, у меня есть права на запись для всего, просто установить в site_perl гораздо проще, и это позволяет мне иметь разные версии. модулей для каждого перл.
Я по-прежнему использую local::lib (или, более конкретно, опции cpanm -l или -L, которые автоматически устанавливают каталог local::lib), чтобы сохранять специфичные для приложения зависимости внутри каталога приложения.
local::lib не был предназначен для работы с несколькими версиями Perl, установленными одновременно. Модули Pure-Perl обычно не являются проблемой, но модули XS не совместимы между основными выпусками.
Вы можете продолжать использовать local::lib для модулей на чистом Perl (поэтому вам не нужно устанавливать их для каждой версии Perl, которую вы заварили, но модули XS должны быть установлены в каталогах, созданных perlbrew. не нужно очищать PERL5LIB (а вы не должны этого делать, поскольку у модулей XS могут быть установлены чистые Perl-зависимости), но вам нужно будет очистить PERL_MB_OPT
а также PERL_MM_OPT
при установке модулей XS, чтобы они не устанавливались в каталог local::lib.
Если вам нужно продолжить использовать local::lib для модулей XS для системы Perl, то я предлагаю создать для этого вторую локальную среду:: lib (возможно, в ~/perl5sys
). Возможно, было бы проще использовать perlbrew для установки копии той же версии Perl, что и системный Perl, а затем использовать ее вместо системного Perl.
Вы можете очистить модули XS в существующей локальной:: lib, удалив /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
каталог.
Это возможно, но не удобно. Если это однопользовательская установка, возможно, лучше не использовать local::lib
и просто позволяя perlbrew управлять модулями за вас. Кроме того, если это многопользовательская установка в однородной сети, где у всех одинаковая машина и ОС, тогда вы можете просто установить PERLBREW_ROOT
например /net/share/perlbrew
и тогда ваши установленные perls (и их модули) могут быть разделены. Как отмечалось в других ответах, это будет проблемой, если вы попытаетесь смешать машины (и, возможно, также проблематичным, если у вас разные операционные системы).
В очень разнородной сети мы предпочитаем держать все отдельно. Вы можете просто настроить свой local::lib
быть функцией вашего текущего Perl и вашей текущей платформы, например
distro=lsb_release -d|cut -f2|tr ' ' '-'
arch=`uname -m`
platform="$distro-$arch"
export PERLBREW_ROOT=/net/share/perlbrew/$platform
# You will have to first do 'perlbrew init' (just once for all users)
# In this case you don't need (and shouldn't have) a ~/.perlbrew
source $PERLBREW_ROOT/etc/bashrc
perl5base=/net/share/perl
# When $PERLBREW_PERL is not defined, local::lib puts modules in $perl5base/$platform
perl5=$perl5base/$platform/$PERLBREW_PERL
# We also found that we needed to clean PERL5LIB in between
export PERL5LIB=`echo -n $PERL5LIB|sed "s|${perl5base}[^:]*||g"`
export PATH=`echo -n $PATH|sed "s|${perl5base}[^:]*||g"`
# Setup local lib, relative to the perl being used
lib=$perl5/lib/perl5
mkdir -p $lib
eval $(perl -I"$lib" -Mlocal::lib="$perl5")
Это не наш точный сценарий, в частности, вам нужно проверить, что все эти каталоги существуют в первую очередь. Вам нужно запускать perlbrew init один раз для каждой платформы, и вам также нужно каждый раз загружать local::lib.
Я не рекомендую такой подход, но приведу в качестве примера один из способов сделать эту работу, который он делает для нашей смешанной сети (даже в Mac OS). Оставить local::lib и просто использовать perlbrew (игнорируя системный perl), было бы более чистым подходом.
perlbrew с удовольствием использует local::lib и уже некоторое время -- для этого есть даже специальные опции -- после запуска
perlbrew install ...
, вы можете создать новый каталог local-lib с помощью
perlbrew lib create ...
Например:
perlbrew install -j 9 --as 34.0 5.34.0
chmod -R a-w $HOME/perl5/perlbrew/perls/34.0
perlbrew lib create 34.0@std
perlbrew switch 34.0@std
Это устанавливает новую сборку 5.34.0, блокирует ее модули, чтобы вы не могли их изменить, а затем создает каталог local-lib. Эту установку можно использовать с
perlbrew use 34.0@std
-- вы можете создать новый набор установок модулей,
perlbrew use 34.0; perlbrew lib create 34.0@other_install
, чтобы использовать бок о бок с существующим без повторной сборки нового Perl.
Как сказал miyagawa, может быть необязательно использовать local::lib, если вы используете исключительно Perls, установленный Perlbrew.
Но если вы все еще хотите иметь возможность переключаться между вашим сваренным Perls и системным Perl, для этого есть скрипт Perlswitcher. Это не красиво, но это работает. Все, что вам нужно сделать, это загрузить скрипт, вы можете сохранить его как ~/perl5/userperls/bashrc
и источник его.
Он предоставляет две команды. perlswitch
позволяет вам переключиться на Perl, который был установлен Perlbrew или на систему Perl. perlinfo
говорит вам, какой Perl в настоящее время используется. Вы можете использовать cpanm
, который установит пакеты в вашу локальную библиотеку при использовании системного Perl или непосредственно на сайт Perl при использовании пользовательского Perl.
После перехода на пользовательский Perl с помощью perlswitch
, perlbrew list
также будет знать, какой Perl используется:
$ perlswitch perl-5.18.4
Setting new perl /var/www/perl5/perlbrew/perls/perl-5.18.4/bin/perl...
Using user perl (site_perl) instead of local::lib
$ perlbrew list
perl-5.16.3
* perl-5.18.4
perl-5.20.2