У меня проблема, я хочу use local::lib;
в сценарии. Но поскольку мне нужно использовать этот скрипт во многих местах, я не хочу пытаться добавить eval
в bashrc
, каждый раз, когда я устанавливаю этот скрипт на сервер. и я не могу получить local::lib, установленный глобально (по умолчанию @INC
) на серверах. Есть ли способ, которым я могу use local::lib
из сценария, чтобы он знал, где модуль local::lib
без eval
, что local::lib
рекомендует и не устанавливает его в каталог по умолчанию @INC
на сервере?Могу ли я использовать локальную :: lib, если local :: lib не установлен глобально и не оценивается в оболочке?
ответ
Что-то вроде этого в верхней части вашего скрипта должен работать, хотя у меня есть локальный :: 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. Различные локальные репозитории, которые он может создать, не привязаны к его местоположению.
Вам нужно знать, по крайней мере, где установлен локальный :: 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
urgh, я надеялся на что-то, что можно было бы сделать из скрипта perl. – xenoterracide
О, это опрятный трюк. Трюк я * положительный *, это плохо для меня, чтобы знать. – darch
очевидно, что это было бы идеальным, но убедительным $ dayjob, что его нужно будет выкачать на наших тысячах серверов ... Я исследую это как возможное решение. – xenoterracide