2011-03-27 14 views
21

अब तक मैं और मैं (उबंटू 10.10 पर) प्रणाली पर्ल उपयोग किया गया है स्थानीय :: lib उपयोग कर रहा था मेरी निजी निर्देशिका ~/perl5perlbrew और स्थानीय :: lib एक ही समय में?

में CPAN मॉड्यूल स्थापित करने के लिए मैं उपयोग करने के लिए कोशिश कर रहा हूँ के रूप में perlbrew ऐसा लगता है कि वे एक दूसरे के बारे में पता नहीं है। मैंने perlbrew का उपयोग कर perl-5.12.3 स्थापित किया है, लेकिन जब मैं perlbrew उपयोग perl-5.12.3 का उपयोग कर इसे स्विच करता हूं, तब भी मुझे स्थानीय :: 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 
तो

यह PERL5LIB वातावरण चर को cpan ग्राहक लेकिन देय राशि का सही संस्करण का उपयोग कर रहा है यह गलत जगह से मॉड्यूल को चुनता है ।

perlbrew कुछ compability विधा है करता है या मैं PERL5LIB और PERL_MM_OPT बंद करने के लिए मैन्युअल रूप से की जरूरत है?

उत्तर

11

local::lib एक ही समय में स्थापित पर्ल के कई संस्करण के साथ काम करने के लिए डिज़ाइन नहीं किया गया था। शुद्ध-पर्ल मॉड्यूल आमतौर पर एक समस्या नहीं होती है, लेकिन एक्सएस मॉड्यूल प्रमुख रिलीज में संगत नहीं होते हैं।

आप शुद्ध-पर्ल मॉड्यूल के लिए स्थानीय :: lib का उपयोग करना जारी रख सकते हैं (इसलिए आपको उन्हें पर्ल के प्रत्येक संस्करण के लिए स्थापित करने की आवश्यकता नहीं है, लेकिन एक्सएस मॉड्यूल perlbrew -created निर्देशिकाओं में स्थापित होना चाहिए । आप (के रूप में XS मॉड्यूल शुद्ध पर्ल निर्भरता है कि वहाँ स्थापित कर रहे हैं हो सकता है, और आप नहीं करना चाहिए) PERL5LIB स्पष्ट करने की जरूरत नहीं है, लेकिन आप PERL_MB_OPT और PERL_MM_OPT स्पष्ट करने के लिए जब XS मॉड्यूल स्थापित करने के लिए उन्हें में स्थापित करने से रखने के लिए की आवश्यकता होगी स्थानीय :: lib निर्देशिका।

यदि आपको सिस्टम पर्ल के लिए एक्सएस मॉड्यूल के लिए स्थानीय :: lib का उपयोग करना जारी रखना है, तो मैं इसके लिए दूसरा स्थानीय :: lib वातावरण बनाने का सुझाव देता हूं (शायद ~/perl5sys में)। perlbre का उपयोग करना आसान हो सिस्टम पर्ल के रूप में पर्ल के समान संस्करण की एक प्रति स्थापित करने के लिए, और उसके बाद सिस्टम पर्ल की बजाय इसका उपयोग करें।

आप /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi निर्देशिका निकाल कर अपने मौजूदा स्थानीय :: lib में XS मॉड्यूल बाहर साफ कर सकते हैं।

+3

मुझे आश्चर्य है कि क्यों लोग PREFIX से अधिक की सिफारिश INSTALL_BASE। स्थानीय :: lib में यह समस्या है क्योंकि यह PREFIX के बजाय INSTALL_BASE का उपयोग करती है। – ikegami

17

चूंकि मैंने पेर्लब्रू का उपयोग करना शुरू किया है, इसलिए मैंने खोल के उपयोग के लिए स्थानीय :: lib का उपयोग करना बंद कर दिया है, क्योंकि अब मेरे पास मेरा खुद का पर्ल है कि मेरे पास सबकुछ लिखने की अनुमति है, बस site_perl पर इंस्टॉल करना बहुत अधिक सरल है, और यह मुझे अनुमति देता है प्रत्येक perl के लिए मॉड्यूल के विभिन्न संस्करणों के लिए।

मैं अभी भी स्थानीय :: lib (या अधिक विशेष रूप से, cpanm's -l या -L विकल्प जो स्वचालित रूप से स्थानीय :: lib निर्देशिका सेट करता है) अनुप्रयोग अनुप्रयोग के अंदर अनुप्रयोग विशिष्ट निर्भरताओं को रखने के लिए उपयोग करता हूं।

4

यह संभव है, लेकिन सहज नहीं। यदि यह एक एकल उपयोगकर्ता सेटअप है, तो आप local::lib का उपयोग न करने से बेहतर हो सकते हैं और केवल perlbrew आपके लिए मॉड्यूल प्रबंधित करने दे सकते हैं। इसके अलावा यदि यह समरूप नेटवर्क पर एक बहु-उपयोगकर्ता सेटअप है, जहां सभी के पास एक ही मशीन और ओएस है, तो आप बस PERLBREW_ROOT को उदा। /net/share/perlbrew और फिर आपके स्थापित perls (और उनके मॉड्यूल) साझा किया जा सकता है। जैसा कि अन्य उत्तरों में उल्लेख किया गया है, यदि आप मशीनों को मिश्रण करने का प्रयास करते हैं तो यह एक समस्या होगी (और यदि आपके पास अलग-अलग ऑपरेटिंग सिस्टम हैं तो संभवतः समस्याग्रस्त भी)।

एक बहुत ही विविध नेटवर्क पर, हम सब कुछ अलग रखने के लिए पसंद करते हैं।आप अपने वर्तमान पर्ल और अपने वर्तमान प्लेटफॉर्म के फ़ंक्शन के लिए बस अपना local::lib सेट कर सकते हैं, उदा।

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 चलाने की आवश्यकता है और आपको प्रत्येक बार स्थानीय :: lib को बूटस्ट्रैप करने की आवश्यकता है।

मैं इस दृष्टिकोण की अनुशंसा नहीं करता हूं, लेकिन यह काम करने के लिए एक तरीका का उदाहरण प्रदान करता हूं, जो हमारे मिश्रित नेटवर्क (यहां तक ​​कि मैक ओएस पर भी) के लिए करता है। स्थानीय :: lib out छोड़कर और केवल perlbrew (सिस्टम perl को अनदेखा कर) का उपयोग करना, एक क्लीनर दृष्टिकोण होगा।

2

मियागावा said के रूप में, यदि आप पर्लब्रे द्वारा विशेष रूप से स्थापित पर्ल्स का उपयोग करते हैं तो स्थानीय :: lib का उपयोग करना आवश्यक नहीं हो सकता है।

लेकिन यदि आप अभी भी अपने ब्रूड पर्ल और सिस्टम पर्ल के बीच स्विच करने में सक्षम होना चाहते हैं, तो इसके लिए Perlswitcher नामक एक स्क्रिप्ट है। यह सुंदर नहीं है लेकिन यह काम करता है। आपको बस स्क्रिप्ट डाउनलोड करना है, आप इसे ~/perl5/userperls/bashrc के रूप में सहेज सकते हैं और इसे स्रोत कर सकते हैं।

यह दो आदेश प्रदान करता है। perlswitch आपको पर्लबू या सिस्टम पर्ल द्वारा स्थापित एक पर्ल पर स्विच करने की अनुमति देता है। perlinfo आपको बताता है कि वर्तमान में कौन सी पर्ल का उपयोग किया जा रहा है। इसके बाद आप cpanm का उपयोग कर सकते हैं, जो कस्टम पर्ल का उपयोग करते समय सिस्टम पर्ल या सीधे पर्ल में सिस्टम का उपयोग करते समय अपने स्थानीय lib में संकुल स्थापित करेगा।

एक कस्टम पर्ल perlswitch उपयोग करने के लिए स्विच करने के बाद, perlbrew list भी पता चल जाएगा जो पर्ल किया जा रहा है:

$ 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

हां !!! मुझे ठीक इसी की आवश्यकता थी! मुझे डेबियन सिस्टम पर्ल के साथ समस्याएं आ रही हैं कि मैं पेर्लब्रू के साथ काफी पुन: उत्पन्न नहीं कर सकता, इसलिए सिस्टम पर्ल पर स्विच करने में सक्षम होने और अभी भी स्थानीय :: lib के साथ निर्भरता स्थापित करना महत्वपूर्ण था। इस स्क्रिप्ट ने प्रक्रिया को दर्द रहित बना दिया। धन्यवाद! –

संबंधित मुद्दे