我有一些相当复杂的库,它们相互连接以完成一些工作,虽然它们主要在我们的服务器上运行,但是它们连接到一些高性能服务器来处理数字。
在我们的服务器上,该行是......
use lib '/home/ourgroup/lib' ;
use HomeGrown::Code ':all' ;
在高性能集群上,它更像是......
use lib '/scratch/ourgroup/lib' ;
use HomeGrown::Code ':all' ;
对于使用这些模块的程序,这是一个相当容易设置的东西,但我不想在代码库中进行特定于服务器的更改。我宁愿能够按原样复制目录。那么,如何告诉我的模块使用我的库目录而不用硬编码呢?
答案 0 :(得分:3)
通常,您可以通过在不同的计算机上设置不同的PERL5LIB
环境变量来实现此目的。是的,它不是纯Perl解决方案,但每个服务器只需执行一次,而不是每次部署一次。
答案 1 :(得分:3)
这就是我们的目标。
use lib '/home/ourgroup/lib' ;
use lib '/scratch/ourgroup/lib' ;
如果/ home / ourgroup / lib在一台机器上不存在,那就这样吧。如果/ scratch / ourgroup / lib不存在,那么就这样吧。它没有抱怨,所以这就是我们正在做的事情。
答案 2 :(得分:2)
您还可以拥有一个检测环境的模块,并为您提供正确的目录。
要使用它,只需执行:
use VarLogRant::FindLibs;
use Stuff;
编写模块:
package VarLogRant::Findlibs;
sub select_lib_dirs {
my @libs;
push @libs, '/home/ourgroup/libs' if need_home();
push @libs, '/scratch/ourgroup/libs' if need_scratch();
# Any other magical logic you want.
}
# It is critical that use lib comes AFTER the functions are defined.
use lib select_lib_dirs();
1;