Подтвердить что ты не робот

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, установленные локальным:: 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?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Вы можете продолжать использовать локальные:: lib для чистых модулей Perl (поэтому вам не нужно устанавливать их для каждой версии Perl, которую вы заварили, но модули XS должны быть установлены в perlbrew. Вам не нужно очищать PERL5LIB (и вы не должны, поскольку у модулей XS могут быть установлены зависимости на основе чистого Perl), но вам понадобится очистить PERL_MB_OPT и PERL_MM_OPT при установке модулей XS, чтобы они не могли быть установлены в каталог local:: lib.

Если вам нужно продолжить использование локальных модулей для модулей XS для системы Perl, я предлагаю создать для этого вторую локальную среду:: lib (возможно, в ~/perl5sys). Может быть проще использовать perlbrew для установки копии той же версии Perl, что и система Perl, а затем использовать ее вместо системы Perl.

Вы можете очистить модули XS в существующей локальной:: lib, удалив каталог /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi.

Ответ 3

Возможно, но это не удобно. Если это однопользовательская настройка, вам может быть лучше не использовать local::lib и просто позволить perlbrew управлять модулями для вас. Кроме того, если это многопользовательская настройка в однородной сети, где все имеют один и тот же компьютер и ОС, то вы можете просто установить PERLBREW_ROOT, например. /net/share/perlbrew, а затем ваши установленные перлы (и их модули) могут использоваться совместно. Как было отмечено в других ответах, это будет проблемой, если вы попытаетесь смешивать машины (и, возможно, также проблематично, если у вас разные операционные системы).

В очень разнообразной сети мы предпочитаем держать все в отдельности. Вы можете просто настроить 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")

Это не наш точный script, в частности вам нужно будет проверить, что все эти каталоги существуют в первую очередь. Вам нужно запустить perlbrew init один раз на платформу, и вы также должны загружать локальный:: lib каждый раз.

Я не рекомендую этот подход, но предоставляю в качестве примера один из способов сделать эту работу, что он делает для нашей смешанной сети (даже в Mac OS). Выход из локального:: lib out и просто использование perlbrew (игнорирование системы perl) было бы более чистым подходом.

Ответ 4

Как сказал miyagawa , может быть необязательно использовать local:: lib, если вы используете Perls, установленные исключительно для Perlbrew.

Но если вы все еще хотите иметь возможность переключаться между вашим заварным Perls и системой Perl, есть script, называемый Perlswitcher для этого. Это не очень, но это работает. Все, что вам нужно сделать, это загрузить script, вы можете сохранить его как ~/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