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

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

2 ответа

Решение

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

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

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

Вы должны знать, по крайней мере, где был установлен 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
Другие вопросы по тегам