2011-07-20 4 views
1

私はいくつかの作業を行うために互いに相互接続するいくつかのかなり複雑なライブラリを用意しています。クランチ数。高性能クラスタ上で当社のサーバー上でユーザー指定のライブラリのディレクトリを動的に設定する方法

、ラインがある...

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

が、それはより多くのモジュールを使用するプログラムのために

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

...のようなものだ、それはですかなり簡単に設定することができますが、コードベースでサーバー固有の変更を加える必要はありません。私はむしろディレクトリをそのままコピーすることができます。だから、どうやってこのようなハードコーディングをせずに私のライブラリディレクトリを使用するようモジュールに指示するのですか?

答えて

3

ここでは何が起こっているのですか。

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

/home/ourgroup/libが1台のマシンに存在しない場合は、そのようにしてください。もし/ scratch/ourgroup/libが他のものに存在しないなら、それもそうです。それは不平を言っていないので、それは私たちがやっていることです。

3

通常、これは、異なるマシンで異なる環境変数PERL5LIBを設定することで実行されます。はい、純粋なPerlソリューションではありませんが、デプロイメントごとに1回ではなく、サーバーごとに1回だけ実行する必要があります。

+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と同じ混乱を起こさなければなりません。 2つの 'libを使用する'行は、それを行う簡単な方法のようです。これを私の9番目のマシンタイプに移植するまで、 –

+0

@VarLogRant、このモジュールをCPANスタイルのライブラリとしてパッケージ化し、通常のPerlデプロイメントの一部としてインストールすると、必要な場所であればどこにでもインストールできます。 – daotoad

+0

私は他の誰かのクラスターでそれを行う権限がありません。 –

関連する問題