web-dev-qa-db-fra.com

J'ai installé un module avec CPAN, mais Perl ne le trouve pas. Pourquoi?

J'ai installé un module CPAN comme ceci:

cpan Acme

Selon la sortie, l'installation a réussi:

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

Mais lorsque j'essaie d'utiliser le module, j'obtiens une erreur:

$ 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.

Pourquoi Perl ne trouve-t-il pas le module même s’il a été installé avec succès? Comment puis-je réparer cela?

14
ThisSuitIsBlackNot

Le module a été installé ici:

/home/foo/Perl5/lib/Perl5/Acme.pm

Mais Perl cherche des modules dans @INC , qui dans ce cas contient:

/usr/local/lib64/Perl5
/usr/local/share/Perl5
/usr/lib64/Perl5/vendor_Perl
/usr/share/Perl5/vendor_Perl
/usr/lib64/Perl5
/usr/share/Perl5
.

(. fait référence au répertoire de travail en cours.)

Puisque le module n'est pas dans @INC, Perl ne peut pas le trouver sans aide.

Pourquoi CPAN a-t-il installé le module en dehors de @INC?

Une cause fréquente est la configuration de CPAN pour bootstrap local :: lib afin que les modules soient installés dans votre répertoire de base plutôt que dans les répertoires Perl du système. Si vous avez CPAN 1.9463 ou supérieur et que vous n'avez pas les droits d'écriture dans le chemin d'installation par défaut, la première fois que vous exécutez CPAN, vous serez invité à:

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]

Si vous choisissez d’amorcer local :: lib (par défaut), le module sera installé dans ~/Perl5. Vous pouvez également être invité à quelque chose comme:

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

Si vous choisissez oui (valeur par défaut), certaines variables seront ajoutées à votre .bashrc (ou l'équivalent pour votre shell) afin que, lorsque vous exécuterez CPAN à l'avenir, les modules continuent à être installés dans votre répertoire personnel:

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;

Comment puis-je le réparer?

Si CPAN a ajouté les variables d’environnement ci-dessus à votre .bashrc (ou l’équivalent), la chose la plus simple à faire est de démarrer un nouveau shell (ou de générer votre .bashrc). Cela définira Perl5LIB pour que Perl puisse trouver les modules installés dans ~/Perl5.

Par contre, si vous avez un accès Sudo et que vous voulez que CPAN installe des modules dans les répertoires Perl du système plutôt que dans votre répertoire personnel, supprimez les paramètres de variable d’environnement de votre .bashrc (ou l’équivalent), démarrez le shell CPAN et exécutez:

o conf init

Cela réinitialisera la configuration CPAN. Vous serez invité à nouveau si vous voulez amorcer local :: lib; entrez "Sudo" à la place. En général, je ne recommanderais pas cela. il est généralement préférable d'utiliser le gestionnaire de paquets de votre distribution (par exemple, yum, apt) pour installer des modules dans les répertoires Perl du système.

Voir aussi: Comment utiliser un module Perl dans un répertoire qui ne se trouve pas dans @INC?

16
ThisSuitIsBlackNot

La solution que j'ai trouvée consiste à localiser /local/lib.pm dans l'un des répertoires @INC et à le supprimer ou à le renommer (en une extension autre que «pm»). Ensuite, renommez (en une extension autre que "sh" ou "csh") ou supprimez /etc/profile.d/Perl-homedir.sh.

0
Todd Merriman