web-dev-qa-db-ja.com

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がモジュールを見つけられないのはなぜですか?どうすれば修正できますか?

16

モジュールはここにインストールされました:

/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をbootstrap 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]

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をソースする)ことです。これは Perl5LIB を設定し、Perlが~/Perl5にインストールされているモジュールを見つけられるようにします。

一方、Sudoアクセスがあり、CPANでホームディレクトリではなくシステムのPerlディレクトリにモジュールをインストールする場合は、.bashrc(または同等のもの)から環境変数の設定を削除し、CPANシェルを起動します。 、そして実行:

o conf init

これにより、CPAN構成がリセットされます。 bootstrap local :: lib; enter "Sudo"。通常、これを行うことはお勧めしません。通常はディストリビューションのパッケージマネージャーを使用することをお勧めします。 (たとえば、yum、apt)を使用して、システムのPerlディレクトリにモジュールをインストールします。

以下も参照してください。 @ INCにないディレクトリでPerlモジュールを「使用」する方法

21

私が見つけた解決策は、/local/lib.pmディレクトリの1つで@INCを見つけて削除するか、名前を変更することです(「pm」以外の拡張子に)。次に、名前を変更するか(「sh」または「csh」以外の拡張子に)、/ etc/profile.d/Perl-homedir.shを削除します。

0
Todd Merriman