2011-07-20 16 views
1

我有一些相当复杂的库,它们互相连接以完成一些工作,尽管它们大多运行在我们的服务器上,但它们正在连接到一些高性能服务器紧缩数字。如何为用户指定的库动态设置目录

在我们的服务器上,该行是...

use lib '/home/ourgroup/lib' ; 
use HomeGrown::Code ':all' ; 

在高性能集群,它更像是......

use lib '/scratch/ourgroup/lib' ; 
use HomeGrown::Code ':all' ; 

对于使用模块的程序,这是一个相当容易的事情来设置,但我想不必在代码库中进行特定于服务器的更改。我宁愿能够照原样复制目录。那么,如何告诉我的模块使用我的库dir而不用像这样硬编码呢?

回答

3

这就是我们要做的。

use lib '/home/ourgroup/lib' ; 
use lib '/scratch/ourgroup/lib' ; 

如果/ home/ourgroup/lib在一台机器上不存在,那就这样吧。如果/ scratch/ourgroup/lib不在另一个上,那就这样吧。它没有抱怨,所以这就是我们正在做的。

3

通常情况下,您可以通过在不同机器上设置不同的PERL5LIB环境变量来实现此目的。是的,这不是纯粹的Perl解决方案,但每台服务器只能执行一次,而不是每次部署一次。

+0

我也不会想到这一点,但是这使得一大堆的道理。谢谢。现在测试它。 –

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; 
+0

事情是这样的,除非VarLogRant :: FindLibs与应用程序在同一个目录中,或者在@INC中列出的某个地方,你必须做与Stuff相同的混乱。两个'使用lib'行似乎是一个更简单的方法来做到这一点。直到我必须将其移植到我的第九种机器类型。 –

+0

@VarLogRant,如果您将此模块打包为CPAN样式的库并将其作为常规Perl部署的一部分进行安装,则它将随处可见。 – daotoad

+0

我没有权利在别人的群集上这样做。 –