Я успешно установил модуль с CPAN, но perl не может его найти. Почему?

Я установил модуль CPAN следующим образом:

cpan Acme

согласно выходным данным, установка прошла успешно:

Running install for module 'Acme'
...
All tests successful.
Files=2, Tests=3,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.04 cusr  0.00 csys =  0.06 CPU)
Result: PASS
  INGY/Acme-1.11111111111.tar.gz
  /usr/bin/make test -- OK
Running make install
Manifying 1 pod document
Installing /home/foo/perl5/lib/perl5/Acme.pod
Installing /home/foo/perl5/lib/perl5/Acme.pm
Installing /home/foo/perl5/man/man3/Acme.3pm
Appending installation info to /home/foo/perl5/lib/perl5/x86_64-linux-thread-multi/perllocal.pod
  INGY/Acme-1.11111111111.tar.gz
  /usr/bin/make install  -- OK

но когда я пытаюсь использовать модуль, я получаю сообщение об ошибке:

$ perl -MAcme -e1
Can't locate Acme.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.

почему perl не может найти модуль, даже если он был установлен успешно? Как я могу это исправить?

2 ответов


модуль был установлен здесь:

/home/foo/perl5/lib/perl5/Acme.pm

но perl ищет модули в @INC, который в данном случае содержит:

/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.

(. относится к текущему рабочему каталогу.)

так как модуль не находится в @INC, Perl не может найти его без помощи.

почему CPAN установил модуль вне @INC?

общей причиной является настройка CPAN для начальной загрузки local:: lib чтобы модули устанавливались в вашем домашнем каталоге, а не в системных каталогах Perl. Если у вас есть CPAN 1.9463 или выше и у вас нет прав на запись в пути установки по умолчанию, при первом запуске CPAN вам будет предложено:

Warning: You do not have write permission for Perl library directories.

To install modules, you need to configure a local Perl library directory or
escalate your privileges.  CPAN can help you by bootstrapping the local::lib
module or by configuring itself to use 'sudo' (if available).  You may also
resolve this problem manually if you need to customize your setup.

What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
 [local::lib]

если вы выберете bootstrap local:: lib (по умолчанию), модуль будет установлен внутри ~/perl5. Вам также может быть предложено что-то вроде:

Would you like me to append that to /home/foo/.bashrc now? [yes]

если вы выберите Да (по умолчанию), некоторые переменные будут добавлены к вашему .bashrc (или эквивалент для вашей оболочки), чтобы при запуске CPAN в будущем модули продолжали устанавливаться в вашем домашнем каталоге:

PATH="/home/foo/perl5/bin${PATH+:}${PATH}"; export PATH;
PERL5LIB="/home/foo/perl5/lib/perl5${PERL5LIB+:}${PERL5LIB}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="/home/foo/perl5${PERL_LOCAL_LIB_ROOT+:}${PERL_LOCAL_LIB_ROOT}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"/home/foo/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=/home/foo/perl5"; export PERL_MM_OPT;

как я могу это исправить?

если CPAN добавил вышеуказанные переменные среды к вашему .bashrc (или эквивалент), самое простое, что нужно сделать, это запустить новую оболочку (или источник вашего .bashrc). Это будет set PERL5LIB так что Perl может найти модули, установленные в ~/perl5.

С другой стороны, если у вас есть доступ к sudo, и вы хотите, чтобы CPAN устанавливал модули в каталогах system Perl, а не в вашем домашнем каталоге, удалите настройки переменной среды из вашего .bashrc (или эквивалент), запустите оболочку CPAN и запустите:

o conf init

это сбросит конфигурацию CPAN. Вам будет предложено еще раз, если вы хотите загрузить local::lib; введите "sudo" вместо этого. В общем, я бы не рекомендовал обычно лучше использовать диспетчер пакетов вашего дистрибутива (например, yum, apt) для установки модулей в системные каталоги Perl.

Смотрите также: как "использовать" модуль Perl в каталоге не в @INC?


решение, которое я нашел, - найти /local/lib.pm в одном из @INC каталоги и удалите его или переименуйте (в расширение, отличное от "pm"). Затем переименуйте (в расширение, отличное от " sh " или "csh") или удалите /etc/profile.d/perl-homedir.sh.