2015-01-08 70 views
1

我有一个服务器,我已经安装了一些perl模块。我通过CPAN安装了前几个,即perl -MCPAN -e'install Module :: Name'作为非root用户。perl cpan模块安装

然后我遇到了一些问题,并开始通过sudo或root安装它们。

昨晚我通过cron作业的输出发现了一些脚本失败,因为它们无法在@INC数组中找到模块。

我发现有问题的服务器上,perl -V来显示以下内容:

为根:

%ENV: 
    PERL5LIB="/root/perl5/lib/perl5:" 
    PERL_LOCAL_LIB_ROOT=":/root/perl5" 
    PERL_MB_OPT="--install_base /root/perl5" 
    PERL_MM_OPT="INSTALL_BASE=/root/perl5" 
@INC: 
    /root/perl5/lib/perl5/x86_64-linux-thread-multi 
    /root/perl5/lib/perl5 
    /usr/local/lib64/perl5 
    /usr/local/share/perl5 
    /usr/lib64/perl5/vendor_perl 
    /usr/share/perl5/vendor_perl 
    /usr/lib64/perl5 
    /usr/share/perl5 

,并作为非root用户:

%ENV: 
    PERL5LIB="/home/user/perl5/lib/perl5:" 
    PERL_LOCAL_LIB_ROOT=":/home/user/perl5" 
    PERL_MB_OPT="--install_base /home/user/perl5" 
    PERL_MM_OPT="INSTALL_BASE=/home/user/perl5" 
@INC: 
    /home/user/perl5/lib/perl5/x86_64-linux-thread-multi 
    /home/user/perl5/lib/perl5 
    /usr/local/lib64/perl5 
    /usr/local/share/perl5 
    /usr/lib64/perl5/vendor_perl 
    /usr/share/perl5/vendor_perl 
    /usr/lib64/perl5 
    /usr/share/perl5 

我检查了另一个服务器,perl模块的安装从来没有出现过问题,并且它显示相同的输出,不管是否以root用户身份运行,只有@INC,没有定义$ ENV。

@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值在服务器上配置CPAN。我宁愿它只有一个perl模块的默认系统位置,所有人都可以访问。我假设我需要从CPAN shell运行o conf init,或直接编辑/root/.cpan/CPAN/MyConfig.pm和/home/user/.cpan/CPAN/MyConfig,但不太确定我需要的确切编辑制造。

谢谢

+3

@INC中的大部分在构建时都被硬编码到Perl中。 Env var像PERL5LIB被添加到它。 “cpan”与此无关。 – ikegami

+0

安装它们的位置应该没有关系,因为它们将安装到的路径将位于'@ INC'中(除非您明确地覆盖此位置)。 – ikegami

+0

请注意,您似乎正在使用系统Perl。你应该让系统的软件包管理器添加软件包,而不是'cpan'。否则可能会有风险。 – ikegami

回答

0

由于后台任务可以被定义为“系统” @ikegami建议,并坚持与系统Perl和使用软件包管理器保持环境跨用户一致的我会做相关的。最好保留根目录/root不在图片中:如果根目录正在安装到他们的$ HOME,那么您可能只需使用系统软件包。

如果是cron创建自定义脚本和运行它们的用户,那么你可以创建一个一致的Perl环境(或几个)与perlbrew用户,local::lib(你似乎已经安装)和cpanminus(其可以安装并与perlbrew无缝配合)。

作为速战速决,你可以扩展你的@INC-I(但非root用户不会能够访问/root明显)和你的%ENV与其他交换机和环境变量。对于其中的一些,参见perlrun - 例如:由-I指定

  • -Idirectory

    目录预先计划为模块的搜索路径(@INC)。

+0

再一次,如果您提供的信息将具有价值,就需要更具体的说明。 – tman

+1

' -I'不添加拱门,IIRC。最好使用'PERL5LIB = ... script'或'perl -Mlib = ... script' – ikegami

+0

@ikegami - 你当然是对的。我忽略了考虑'XS'扩展等。更坚持使用供应商软件包的更多理由。 –