我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为什么?
I installed a module successfully with CPAN, but perl can't find it. Why?
我安装了这样的 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 无法在没有一些帮助的情况下找到它。
为什么 CPAN 在 @INC
之外安装模块?
一个常见的原因是将 CPAN 配置为 bootstrap local::lib so that modules are installed in your home directory instead of in the system Perl directories. If you have CPAN 1.9463 or higher 而您在默认安装路径中没有写权限,第一次 运行 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
(或您的 shell 的等价物),以便当您 运行 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
(或等效项),最简单的做法是启动一个新的 shell(或获取您的 .bashrc
)。这将设置 PERL5LIB
以便 perl 可以找到安装在 ~/perl5
.
中的模块
另一方面,如果您有 sudo 访问权限并且希望 CPAN 在系统 Perl 目录中而不是在您的主目录中安装模块,请从您的 .bashrc
(或等效项)中删除环境变量设置, 启动 CPAN shell, 和 运行:
o conf init
这将重置 CPAN 配置。如果要 bootstrap local::lib,系统会再次提示您;输入 "sudo" 代替。一般来说,我不建议这样做;通常最好使用发行版的包管理器(例如 yum、apt)在系统 Perl 目录中安装模块。
另见:How do I 'use' a Perl module in a directory not in @INC?
我找到的解决方案是在 @INC
目录之一中找到 /local/lib.pm
并将其删除或重命名(扩展名为 'pm' 以外的扩展名)。然后,重命名(扩展名为 'sh' 或 'csh' 以外的扩展名)或删除 /etc/profile.d/perl-homedir.sh.
在 Centos 7 /RedHat 7 上,这是由包 perl-homedir 引起的。它通过 /etc/profile.d 设置变量。去掉它。一切都按预期进行。我花了几个小时才弄清楚为什么我无法从 Epel 或 CentOS 重建软件包。
我安装了这样的 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 无法在没有一些帮助的情况下找到它。
为什么 CPAN 在 @INC
之外安装模块?
一个常见的原因是将 CPAN 配置为 bootstrap local::lib so that modules are installed in your home directory instead of in the system Perl directories. If you have CPAN 1.9463 or higher 而您在默认安装路径中没有写权限,第一次 运行 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
(或您的 shell 的等价物),以便当您 运行 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
(或等效项),最简单的做法是启动一个新的 shell(或获取您的 .bashrc
)。这将设置 PERL5LIB
以便 perl 可以找到安装在 ~/perl5
.
另一方面,如果您有 sudo 访问权限并且希望 CPAN 在系统 Perl 目录中而不是在您的主目录中安装模块,请从您的 .bashrc
(或等效项)中删除环境变量设置, 启动 CPAN shell, 和 运行:
o conf init
这将重置 CPAN 配置。如果要 bootstrap local::lib,系统会再次提示您;输入 "sudo" 代替。一般来说,我不建议这样做;通常最好使用发行版的包管理器(例如 yum、apt)在系统 Perl 目录中安装模块。
另见:How do I 'use' a Perl module in a directory not in @INC?
我找到的解决方案是在 @INC
目录之一中找到 /local/lib.pm
并将其删除或重命名(扩展名为 'pm' 以外的扩展名)。然后,重命名(扩展名为 'sh' 或 'csh' 以外的扩展名)或删除 /etc/profile.d/perl-homedir.sh.
在 Centos 7 /RedHat 7 上,这是由包 perl-homedir 引起的。它通过 /etc/profile.d 设置变量。去掉它。一切都按预期进行。我花了几个小时才弄清楚为什么我无法从 Epel 或 CentOS 重建软件包。