如果local :: lib没有全局安装且没有在shell中进行评估,我可以使用local :: lib吗?

时间:2011-01-12 05:55:53

标签: perl locallib

我遇到问题,我想在脚本中use local::lib;。但是因为我需要在很多地方使用这个脚本,所以每次将这个脚本安装到服务器时,我都不想尝试将eval添加到bashrc。我无法在服务器上全局安装local::lib(默认@INC)。我是否可以在脚本中use local::lib以便知道模块local::lib在没有eval推荐的local::lib的情况下的位置,而无需将其安装到目录中服务器上的默认@INC

2 个答案:

答案 0 :(得分:3)

您至少需要知道local :: lib的安装位置,并且您无法解决此问题,因此您需要一个shell命令或环境变量声明。假设您使用了--bootstrap的默认值,这是Bash中用于查找库的最小示例:

# persistent for this shell only
export PERL5LIB=$PERL5LIB:$(perl -MConfig -e'print "$ENV{HOME}/perl5/lib/perl5/$Config{archname}:$ENV{HOME}/perl5/lib/perl5"')
perl yourprog
perl yourprog
perl yourprog

或只是

# environment for one run of perl only
PERL5LIB=$PERL5LIB:$(perl -MConfig -e'print "$ENV{HOME}/perl5/lib/perl5/$Config{archname}:$ENV{HOME}/perl5/lib/perl5"') perl yourprog

简单地对目录名进行硬编码是安全的,从而避免使用eval并调用perl。

use local::lib;将从扩展的@INC中找到并加载模块。如果您确实需要,请检查%INC以查看具体位置。

警告:您现在不能使用local :: lib来安装其他模块,这需要在其打印出的通常eval中进行的其余声明。


根据下面的urgh,使用重新执行技巧从内部设置环境变量。

use autodie qw(:all);
unless ($ENV{REEXEC}) {
    $ENV{REEXEC} = 1;
    $ENV{PERL5LIB} = …
    exec $^X, $0;
}
# main starts here

答案 1 :(得分:1)

脚本顶部的这样的东西应该可以工作,虽然我在常规的@INC中的所有盒子上都安装了local :: lib,所以它没有经过测试 -

use lib "/path/to/local/lib's/lib";
use local::lib "/path/to/specific/local-lib/base/you/want";

我建议以相同的方式安装local :: lib,在默认的@INC中使用你的主env perl。它可以创建的各种本地存储库与其位置无关。