2011-01-12 1 views
1

У меня проблема, я хочу use local::lib; в сценарии. Но поскольку мне нужно использовать этот скрипт во многих местах, я не хочу пытаться добавить eval в bashrc, каждый раз, когда я устанавливаю этот скрипт на сервер. и я не могу получить local::lib, установленный глобально (по умолчанию @INC) на серверах. Есть ли способ, которым я могу use local::lib из сценария, чтобы он знал, где модуль local::lib без eval, что local::lib рекомендует и не устанавливает его в каталог по умолчанию @INC на сервере?Могу ли я использовать локальную :: lib, если local :: lib не установлен глобально и не оценивается в оболочке?

ответ

1

Что-то вроде этого в верхней части вашего скрипта должен работать, хотя у меня есть локальный :: LIB установлен на все мои ящики в регулярном @INC так что untested-

use lib "/path/to/local/lib's/lib"; 
use local::lib "/path/to/specific/local-lib/base/you/want"; 

Я бы рекомендовал с локальным :: lib установлен таким же образом, в стандартном @INC с вашим основным env perl. Различные локальные репозитории, которые он может создать, не привязаны к его местоположению.

+1

очевидно, что это было бы идеальным, но убедительным $ dayjob, что его нужно будет выкачать на наших тысячах серверов ... Я исследую это как возможное решение. – xenoterracide

3

Вам нужно знать, по крайней мере, где установлен локальный :: lib, и вы не обойдетесь, указав это, поэтому вам потребуется одна команда оболочки или объявление переменной среды. Предполагая, что вы использовали по умолчанию для --bootstrap, это минимальный пример в Баш на Perl, чтобы найти библиотеку:

# persistent for this shell only 
export PERL5LIB=$PERL5LIB:$(perl -MConfig -e'print "$ENV{HOME}/perl5/lib/perl5/$Config{archname}:$ENV{HOME}/perl5/lib/perl5"') 
perl yourprog 
perl yourprog 
perl yourprog 

или просто

# environment for one run of perl only 
PERL5LIB=$PERL5LIB:$(perl -MConfig -e'print "$ENV{HOME}/perl5/lib/perl5/$Config{archname}:$ENV{HOME}/perl5/lib/perl5"') perl yourprog 

Это безопасно просто жестко закодировать имена каталогов и таким образом, избегайте eval и звоните в perl.

use local::lib; найдет и загрузит модуль с расширенного @INC. Осмотрите %INC, чтобы увидеть конкретное местоположение, если оно вам действительно нужно.

Предостережение: вы не можете использовать локальные :: lib сейчас, чтобы установить дополнительных модулей, которым нужны остальные объявления, сделанные в обычном eval, который он распечатывает.


Установка окружения vars изнутри с помощью трюка для повторной передачи согласно урху ниже.

use autodie qw(:all); 
unless ($ENV{REEXEC}) { 
    $ENV{REEXEC} = 1; 
    $ENV{PERL5LIB} = … 
    exec $^X, $0; 
} 
# main starts here 
+0

urgh, я надеялся на что-то, что можно было бы сделать из скрипта perl. – xenoterracide

+1

О, это опрятный трюк. Трюк я * положительный *, это плохо для меня, чтобы знать. – darch

 Смежные вопросы

  • Нет связанных вопросов^_^