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
Другие вопросы по тегам