Могу ли я использовать 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