Perl - Как ссылаться на модуль, установленный локально?
У меня есть модуль Term:TermKey, который находится в файле TermKey.pm. Я не хочу устанавливать его в свой Perl; Я хочу, чтобы на него ссылались локально, чтобы скрипт можно было перенести на другие машины, не мешая при каждой установке perl. Как мне это сделать? Ни одна из рекомендаций, которые я видел в Интернете, не работает. Я всегда получаю некоторую форму:
Can't locate loadable object for module Term::TermKey in @INC (@INC contains: /home/fritz/multi.kodis/Term /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at test.pl line 6.
Compilation failed in require at test.pl line 6.
BEGIN failed--compilation aborted at test.pl line 6.
Чтобы проверить это. Я разместил копии TermKey.pm во всех:
./TermKey.pm
./Term/TermKey.pm
./Term/Term/TermKey.pm
(просто как тест)
Все же это не работает ни для одного из:
use lib '';
use Term::TermKey;
use lib '.';
use Term::TermKey;
use lib './';
use Term::TermKey;
use lib './Term';
use Term::TermKey;
use lib './Term/';
use Term::TermKey;
use lib '/home/[user]/[project]'
use Term::TermKey;
use lib '/home/[user]/[project]/Term'
use Term::TermKey;
use FindBin;
use lib "$FindBin::RealBin";
use Term::TermKey;
Какого черта? Это должно быть легко, что мне не хватает?
1 ответ
"Не удается найти загружаемый объект для модуля" не означает, что Perl не может найти Term/TermKey.pm. Это означает, что он не может найти Term/TermKey.so (или какие-либо общие библиотеки, вызываемые на вашей платформе).
Term:: TermKey не является чистым Perl-модулем. Вместо этого он включает код XS, который необходимо скомпилировать в C, а затем в общую библиотеку. Кроме того, эта библиотека ссылается на libtermkey, который также должен быть установлен в вашей системе.
Это значительно усложняет перемещение модуля из системы в систему. Модуль XS, скомпилированный для Perl 5.18.2, не будет работать с 5.20.0; это должно быть перекомпилировано. Вы можете обновить второстепенные выпуски (например, с 5.18.0 до 5.18.2) без необходимости перекомпиляции, хотя работа в другом направлении (с 5.18.2 до 5.18.0) не гарантируется.
Таким образом, вы могли бы заставить это работать, если на всех машинах установлена одна и та же версия Perl в одной и той же ОС с установленными библиотеками. Самый простой способ (если он вообще работает) - установить cpanm и local:: lib и сделать что-то вроде:
cpanm --local-lib some-dir Term::TermKey
Тогда вы могли бы скопировать some-dir
на другую машину (с оговорками, перечисленными выше). Нет необходимости устанавливать local:: lib на других машинах; ты можешь просто
use lib 'some-dir/lib/perl5';