我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为啥?

Posted

技术标签:

【中文标题】我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为啥?【英文标题】:I installed a module successfully with CPAN, but perl can't find it. Why?我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为什么? 【发布时间】:2015-12-19 23:44:20 【问题描述】:

我安装了一个这样的 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安装成功却找不到模块?我该如何解决这个问题?

【问题讨论】:

我最近看到了几个这样的问题(***.com/q/28992210/176646、***.com/q/32219489/176646、***.com/q/32699696/176646,可能是***.com/q/31039341/176646 ...有趣的是,都在 OS X 上)所以我写了一个规范的 Q /A 我们可以向人们指出。欢迎对问题和答案进行编辑。 (我现在无法访问 OS X 或 Windows,所以一些细节可能需要调整。) 【参考方案1】:

模块安装在这里:

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

如果您选择引导 local::lib(默认),模块将安装在 ~/perl5 中。可能还会提示您:

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

如果您选择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外壳,然后运行:

o conf init

这将重置 CPAN 配置。如果要引导 local::lib,系统会再次提示您;改为输入“sudo”。一般来说,我不建议这样做;通常最好使用发行版的包管理器(例如 yum、apt)在系统 Perl 目录中安装模块。

另见:How do I 'use' a Perl module in a directory not in @INC?

【讨论】:

【参考方案2】:

在 Centos 7 /RedHat 7 上,这是由包 perl-homedir 引起的。它通过 /etc/profile.d 设置变量。去掉它。比一切都按预期工作。我花了几个小时才弄清楚为什么我无法从 Epel 或 CentOS 重建一个包。

【讨论】:

【参考方案3】:

我找到的解决方案是在@INC 目录之一中找到/local/lib.pm 并将其删除或重命名(改为'pm' 以外的扩展名)。然后,重命名(改为 'sh' 或 'csh' 以外的扩展名)或删除 /etc/profile.d/perl-homedir.sh。

【讨论】:

以上是关于我用 CPAN 成功安装了一个模块,但是 perl 找不到它。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 perlbrew 时安装 CPAN 模块?

centos环境下使用CPAN安装perl模块

在 XAMPP for Windows 上从 CPAN 安装 perl 模块

perl 下使用非root用户安装模块

安装Perl的CPAN模块

Perl 模块安装教程总结