Почему мой Perl-скрипт не находит мой модуль даже после того, как я настроил @INC с помощью FindBin? - PullRequest
2 голосов
/ 15 ноября 2009

Я хочу иметь возможность использовать модуль, хранящийся в каталоге lib моего репозитория исходного кода, и я хочу, чтобы единственное предварительное условие для разработчика, чтобы использовать сценарии, которые я пишу, - это наличие стандарта Установка Perl, но я не уверен, как это сделать.

В моих скриптах у меня есть

use FindBin qw($Bin);
use lib "$Bin/lib"; # store non standard modules here
use Term::ANSIColor;
use Win32::Console::ANSI;
print Term::ANSIColor::colored("this should be in color\n", "bold red");

и я вставил модуль в ./lib. Я проверил, что это фактическое место, где существует модуль (переименовав его и вызвав сбой). Тем не менее, даже если модуль находится в произвольном каталоге lib, по-прежнему требуется, чтобы ppm знал о модуле.

Я не могу заставить свои скрипты найти / использовать его в lib, если он не был "установлен" ppm первым. Я полагаю, что должен быть какой-то способ обойти это.

Я знаю, что это может быть нетипичная просьба, но мои цели, вероятно, нетипичны. Я просто хочу, чтобы разработчик сделал оформление заказа и немедленно использовал некоторые сценарии, не выполняя некоторые дополнительные команды или не используя менеджер пакетов.

Спасибо за понимание.

РЕДАКТИРОВАТЬ: Я обновил с полным примером. Я также понял, что если я удаляю его через ppm (но оставляю pm в указанном каталоге), возможно, мне придется изменить свой синтаксис, и я не рассматривал это раньше. Поэтому, возможно, мне придется указать полный путь или использовать require, например, jheddings или BipedalShark propose (то есть, если он не «установлен», тогда я должен использовать «require» и добавить к нему «.pm» или использовать блок BEGIN.

Если это так, то я не нашел правильный синтаксис.

РЕДАКТИРОВАТЬ 2: Исходя из комментария ниже, я понимаю, что у меня может быть ошибочное предположение. Я рассуждаю так: если я ссылаюсь непосредственно на фактический код, «.pm», я могу использовать его без менеджера пакетов. Может быть, это не так, или если я хочу сделать это, может быть, я должен сделать это по-другому. В качестве альтернативы мне может потребоваться рефакторинг кода в «.pm».

РЕДАКТИРОВАТЬ 3: Я думаю, что я неправильно понял несколько вещей. Сообщение об ошибке в моей среде IDE «Компиляция не удалась по требованию», выделение строки, которую я использовал для включения модуля, и сообщение об ошибке консоли «Не удается найти загружаемый объект для модуля Win32 :: Console :: ANSI»

Я читал, что это проблема загрузки самого модуля, но, похоже, это проблема, возникающая из-за того, что сам модуль пытается загрузить. Интересно, что это только проблема, поскольку я не использовал установку ppm.

Находит фактический модуль. Я смог убедиться в этом, комментируя проблемы.

Спасибо за помощь, но мне придется потратить еще немного времени с ней.

Ответы [ 5 ]

3 голосов
/ 15 ноября 2009

См. perldoc perldiag в разделе «Не удается найти загружаемый объект для модуля ...»:

    (F) The module you loaded is trying to load an external library,
    like for example, "foo.so" or "bar.dll", but the DynaLoader module
    was unable to locate this library.  See DynaLoader.

Вы правы, что эта проблема возникает из-за того, что модуль пытается загрузить - это то, что делает Dynaloader . Однако в документации для Win32 :: Console :: ANSI не упоминаются какие-либо требования к внешней библиотеке.

2 голосов
/ 15 ноября 2009

От ответа perlfaq8 на Как добавить каталог, в котором находится моя программа, к пути поиска модуля / библиотеки?

Вы, кажется, делаете это правильно, но вам нужно дать нам больше, если вы ожидаете получить помощь.

Когда вы запускаете этот скрипт, что получается в @INC? Вставьте строку отладки, например:

 BEGIN {
      use lib ...;
      print "INC is \@INC\n"; 
      }

Убедитесь, что этот вывод показывает ожидаемый каталог. Если этого не произойдет, начните разбивать проблему оттуда.

2 голосов
/ 15 ноября 2009

Сохраняете ли вы структуру вашего модуля в каталоге lib?
т. е. ваш модуль должен быть в пути $Bin/lib/Some/Module.pm.

1 голос
/ 21 сентября 2010

Попробуйте это:

BEGIN {
    use FindBin qw($Bin);
}
use lib "$Bin/lib"; # store non standard modules here
0 голосов
/ 15 ноября 2009

Я вручную устанавливаю модули все время, и это, кажется, работает. Я просто копирую каталоги и файлы в папку и использую директиву use lib, как вы показали. Иногда я пропускаю файл и получаю ошибку во время выполнения, что он ищет определенный файл, и я иду найти файл в Интернете и помещаю его в нужное место, и он работает. Не уверен, что происходит с вашей настройкой. Это должно работать.

Обычно я помещаю модули perl в тот же каталог, что и мой скрипт, а затем: использую lib "." Но я не знаю, что это будет иметь значение.

...