2011-03-27 51 views
21

到目前爲止,我一直在使用該系統的Perl(在Ubuntu 10.10),我是用本地:: lib中在我的私人目錄〜/ perl5的perlbrew和local :: lib在同一時間?

安裝CPAN模塊,我想使用perlbrew似乎他們不瞭解對方。我使用perlbrew安裝了perl-5.12.3,但是當我使用perlbrew使用perl-5.12.3切換到它時,我仍然看到由local :: lib設置的PERL5LIB和PERL_MM_OPT。

這不是好:

$ cpan XML::Simple 
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/perl: symbol lookup error: /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Cwd/Cwd.so: undefined symbol: Perl_Gthr_key_ptr 

$ which cpan 
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan 

所以它使用CPAN客戶端,但會費的正確版本的PERL5LIB環境變量,它拿起從錯誤的地方模塊。

perlbrew有一些compability模式還是我需要手動關閉PERL5LIB和PERL_MM_OPT?

回答

11

local::lib未被設計爲與多個版本的Perl同時安裝。 Pure-Perl模塊通常不是問題,但XS模塊在主要版本中不兼容。

您可以繼續使用local :: lib for pure-Perl模塊(因此您不必爲每個已釀造的Perl版本安裝它們,但XS模塊應該安裝到perlbrew創建的目錄中。你不需要清除PERL5LIB(你不應該這樣做,因爲XS模塊可能有安裝在那裏的純Perl依賴關係),但是在安裝XS模塊時你需要清除PERL_MB_OPTPERL_MM_OPT以防止它們安裝到local :: lib目錄

如果您需要繼續使用local :: lib作爲系統Perl的XS模塊,那麼我建議爲此創建第二個local :: lib環境(可能在~/perl5sys)。更容易使用perlbre w安裝與系統Perl相同版本Perl的副本,然後使用它來代替系統Perl。

您可以通過刪除/home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi目錄來清理現有local :: lib中的XS模塊。

+3

我不知道爲什麼人們建議INSTALL_BASE了前綴。 local :: lib有這個問題,因爲它使用INSTALL_BASE而不是PREFIX。 – ikegami 2011-03-27 08:56:33

17

由於我開始使用perlbrew,因此我停止使用local :: lib作爲shell使用,因爲現在我擁有自己的perl,並且擁有對所有內容的寫權限,只需安裝到site_perl就簡單多了,而且可以讓我爲每個perl擁有不同版本的模塊。

我仍然使用local :: lib(或更具體地說,cpanm的-l或-L選項自動設置local :: lib目錄)來保持應用程序目錄內的應用程序特定的依賴關係。

4

這是可能的,但不舒服。如果這是一個單用戶設置,那麼最好不要使用local::lib,而只是讓perlbrew爲你管理模塊。同樣,如果它是同質網絡上的多用戶設置,每個人都有相同的機器和操作系統,那麼您可以將PERLBREW_ROOT設置爲例如/net/share/perlbrew,然後您可以共享您安裝的perls(及其模塊)。正如在其他答案中指出的那樣,如果您嘗試混合機器,這會成爲問題(如果您擁有不同的操作系統,也可能會出現問題)。

在一個非常多元化的網絡中,我們更願意將所有事情分開。您可以簡單地將您的local::lib設置爲當前perl和您當前平臺的功能,例如,

distro=lsb_release -d|cut -f2|tr ' ' '-' 
arch=`uname -m` 
platform="$distro-$arch" 

export PERLBREW_ROOT=/net/share/perlbrew/$platform 
# You will have to first do 'perlbrew init' (just once for all users) 
# In this case you don't need (and shouldn't have) a ~/.perlbrew 
source $PERLBREW_ROOT/etc/bashrc 

perl5base=/net/share/perl 
# When $PERLBREW_PERL is not defined, local::lib puts modules in $perl5base/$platform 
perl5=$perl5base/$platform/$PERLBREW_PERL 

# We also found that we needed to clean PERL5LIB in between 
export PERL5LIB=`echo -n $PERL5LIB|sed "s|${perl5base}[^:]*||g"` 
export PATH=`echo -n $PATH|sed "s|${perl5base}[^:]*||g"` 

# Setup local lib, relative to the perl being used 
lib=$perl5/lib/perl5 
mkdir -p $lib 
eval $(perl -I"$lib" -Mlocal::lib="$perl5") 

這不是我們確切的腳本,尤其是您需要檢查這些目錄是否全部存在。你需要爲每個平臺運行一次perlbrew init,並且每次都需要引導local :: lib。

我不推薦這種方法,但提供了一個方法來使這項工作,它爲我們的混合網絡(即使在Mac OS上)做的一個例子。離開local :: lib並使用perlbrew(忽略系統perl)將是一個更簡潔的方法。

2

作爲miyagawa said,如果您僅使用由Perlbrew安裝的Perls,則可能不需要使用local :: lib。

但是,如果您仍然希望能夠在已釀造的Perls和系統Perl之間來回切換,那麼有一個名爲Perlswitcher的腳本。它不漂亮,但它的工作原理。所有你需要做的就是下載腳本,你可以將它保存爲~/perl5/userperls/bashrc並源代碼。

它提供了兩個命令。 perlswitch允許您切換到由Perlbrew或系統Perl安裝的Perl。 perlinfo告訴你哪個Perl當前正在被使用。然後,您可以使用cpanm,它將在使用系統Perl時將軟件包安裝到本地庫,或者在使用自定義Perl時將軟件包直接安裝到網站Perl中。

切換到使用perlswitch一個自定義的Perl後,perlbrew list也知道正在使用的Perl:

$ perlswitch perl-5.18.4 
Setting new perl /var/www/perl5/perlbrew/perls/perl-5.18.4/bin/perl... 
Using user perl (site_perl) instead of local::lib 
$ perlbrew list 
    perl-5.16.3 
* perl-5.18.4 
    perl-5.20.2 
+0

是的!!!這正是我需要的!我遇到了Debian的系統perl問題,我無法用perlbrew完全重現,所以能夠切換到系統perl並仍然使用local :: lib安裝依賴關係很重要。這個腳本使這個過程變得無痛苦。謝謝! – 2015-12-02 12:27:44

相關問題