perlbrew и local :: lib одновременно? - PullRequest
22 голосов
/ 27 марта 2011

До сих пор я использовал системный 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?

Ответы [ 4 ]

17 голосов
/ 28 марта 2011

Так как я начал использовать perlbrew, я перестал использовать local :: lib для использования в оболочке, потому что теперь, когда у меня есть свой собственный perl, у меня есть права на запись для всего, просто установка на site_perl стала намного проще, и это позволяет мнеу меня разные версии модулей для каждого perl.

Я по-прежнему использую local :: lib (или, более конкретно, опции cpanm -l или -L, которые автоматически устанавливают каталог local :: lib), чтобы сохранять специфичные для приложения зависимости внутрикаталог приложений.

11 голосов
/ 27 марта 2011

local :: lib не предназначен для работы с несколькими версиями Perl, установленными одновременно. Модули Pure-Perl обычно не являются проблемой, но модули XS не совместимы между основными выпусками.

Вы можете продолжать использовать local :: lib для модулей чистого Perl (поэтому вам не нужно устанавливать их для каждой версии Perl, которую вы заварили, но модули XS должны быть установлены в perlbrew * Каталоги, созданные 1006 *. Вам не нужно очищать 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.

5 голосов
/ 18 мая 2011

Это возможно, но не удобно. Если это однопользовательская настройка, вам лучше не использовать 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), это был бы более чистый подход.

2 голосов
/ 14 ноября 2015

Как сказал 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
...