Я использую use lib "./DIR"
захватить библиотеку от папки в другом месте. Однако это, кажется, не работает над моим сервером, но это хорошо работает на моем локальном рабочем столе. Какие-либо конкретные причины?
И еще один вопрос, делает use lib
быть распространенными в нескольких модулях?
Две ситуации: Скажите, что я делаю базовый класс, который требует нескольких библиотек, но я знаю, что он должен быть расширен, и расширенный класс должен будет пользоваться другой библиотекой. Я могу поместить use lib
команда в базовом классе? или я должен буду поместить его в каждый расширяющийся класс?
Наконец, могу я просто иметь a use package
где пакет содержит набор lib использования, он распространит операторы lib использования к моему текущему модулю? <-я не думаю так, но выяснение так или иначе
.
в вашем операторе use lib
означает «текущий рабочий каталог» и будет работать только тогда, когда ваш скрипт запускается из правильного каталога. Серверное представление о cwd, вероятно, отличается (или не определено). Предполагая, что каталог библиотеки совмещен со скриптом и является частным для него, вы хотите вместо этого сделать что-то вроде этого:
use FindBin;
use lib "$FindBin::Bin/DIR";
Оператор use lib
влияет на @INC
- список местоположений, которые выполняет поиск Perl, когда вы используете
или требуете
модуль. Это глобально влияет на текущий экземпляр интерпретатора. Вы действительно должны помещать операторы use lib
только в сценарии, а не в модули.
В принципе, у вас может быть пакет MyLibs
, состоящий из набора операторов use lib
, а затем использовать MyLibs
перед использованием любого из пакетов в эти места, но я бы не рекомендовал это.
Невозможно узнать, почему он не работает на вашем сервере, без дополнительной информации. В частности, проверьте журналы ошибок вашего сервера и, если необходимо, сделайте дамп @INC
и сравните их с реальными путями к библиотекам.
use lib
изменяет @INC
, который является глобальным, поэтому, пока вы выполняете свою use lib
до того, как другие пакеты попытаются включить что-то, он будет работать, и все другие пакеты увидят новые пути включения.
Подробнее о @INC
см. Его запись в perlvar .