Могу ли я использовать local :: lib, если local :: lib не установлен глобально и не проверен в оболочке? - PullRequest
1 голос
/ 12 января 2011

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

Ответы [ 2 ]

3 голосов
/ 12 января 2011

Вам нужно хотя бы знать, где был установлен local :: lib, и вы не сможете обойтись без этого, поэтому вам нужно объявить одну команду оболочки или переменную среды. Предполагая, что вы использовали значение по умолчанию для --bootstrap, это минимальный пример bash для 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, чтобы увидеть конкретное место, если вам это действительно нужно.

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


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

use autodie qw(:all);
unless ($ENV{REEXEC}) {
    $ENV{REEXEC} = 1;
    $ENV{PERL5LIB} = …
    exec $^X, $0;
}
# main starts here
1 голос
/ 15 января 2011

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

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

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

...