次のような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がモジュールを見つけられないのはなぜですか?どうすれば修正できますか?
モジュールはここにインストールされました:
/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は何らかの助けなしではそれを見つけることができません。
@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モジュールを「使用」する方法
私が見つけた解決策は、/local/lib.pm
ディレクトリの1つで@INC
を見つけて削除するか、名前を変更することです(「pm」以外の拡張子に)。次に、名前を変更するか(「sh」または「csh」以外の拡張子に)、/ etc/profile.d/Perl-homedir.shを削除します。