2011-07-20 57 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

我沒有權利在別人的羣集上這樣做。 –