我遇到问题,我想在脚本中use local::lib;
。但是因为我需要在很多地方使用这个脚本,所以每次将这个脚本安装到服务器时,我都不想尝试将eval
添加到bashrc
。我无法在服务器上全局安装local::lib(默认@INC
)。我是否可以在脚本中use local::lib
以便知道模块local::lib
在没有eval
推荐的local::lib
的情况下的位置,而无需将其安装到目录中服务器上的默认@INC
?
答案 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。它可以创建的各种本地存储库与其位置无关。