2008-12-29 21 views
29

recent question यहां मुझे सोचा गया।पैकेज प्रबंधक का उपयोग करते समय आप पर्ल मॉड्यूल का प्रबंधन कैसे करते हैं?

सबसे लिनक्स वितरण है कि मैं करने की कोशिश की, कुछ पर्ल मॉड्यूल पैकेज प्रबंधक के माध्यम से उपलब्ध होगा पर

। अन्य, ज़ाहिर है, नहीं। थोड़ी देर के लिए जब भी मुझे पैकेज उपलब्ध था या नहीं, और इसे स्थापित करने के लिए कुछ सीपीएएन मॉड्यूल स्थापित करने की आवश्यकता होती है, तो मैं अपने पैकेज मैनेजर का उपयोग करूंगा।

स्पष्ट लाभ यह है कि आप अपने मॉड्यूल अद्यतन जब भी पैकेज का एक नया संस्करण उपलब्ध हो जाता है मिलता है।

हालांकि, अगर आप मुसीबत में पड़ जब मॉड्यूल पहले से पैक के रूप में उपलब्ध नहीं है और वहाँ कि मॉड्यूल हैं कि के लिए निर्भरता है। प्रत्येक बार सीपीए खोल पूछता है कि क्या यह निर्भरता का पालन करना चाहिए या नहीं, अपने पैकेज प्रबंधक को फायरिंग करना काफी थकाऊ हो सकता है।

अक्सर, एक और दोष पूर्व-पैक मॉड्यूल का संस्करण है। यदि आप डेबियन या उबंटू चला रहे हैं तो आपको जल्द ही पता चलेगा कि आप खून बहने वाले किनारे पर नहीं रह पाएंगे, जैसे कई सीपीएएन मॉड्यूल लेखकों को लगता है।

लिनक्स पर अन्य पर्ल लोग इस समस्या को कैसे संभालते हैं? क्या आप बस अनदेखा करते हैं कि आपके पैकेज प्रबंधकों को क्या पेश करना है? क्या कोई उपकरण है जो उपयुक्त (उदाहरण के लिए) और सीपीए बेहतर टीम साथी बनाता है? या आप बस सीपीए खोल के माध्यम से कुछ भी स्थापित नहीं करते हैं?

+0

मैंने शीर्षक को बदल दिया है "आप लिनक्स पर पर्ल मॉड्यूल कैसे प्रबंधित करते हैं?" "पैकेज प्रबंधक का उपयोग करते समय आप पर्ल मॉड्यूल का प्रबंधन कैसे करते हैं?", क्योंकि यह किसी भी सिस्टम पर प्रासंगिक है जहां पैकेज प्रबंधक को पर्ल स्थापित करने के लिए इस्तेमाल किया जा सकता है, कड़ाई से लिनक्स नहीं - उदाहरण के लिए ओएसएक्स के लिए मैकपोर्ट्स (http://macports.org) वितरण। – Ether

उत्तर

7

चूंकि यह प्रश्न मूल रूप से पूछा गया था, perlbrew जारी किया गया है। यह कस्टम, स्वयं निहित perl स्थापित करता है तुच्छ स्थापित करता है। और उन संस्करणों के बीच स्विच बस के रूप में आसान है:

perlbrew switch $version 
+0

क्या आप इस पर विस्तार कर सकते हैं, और इसका उपयोग कैसे करें? मेरा मतलब है, क्या आप अपनी स्थापना का नाम दे सकते हैं, 'perlbrew स्विच mytest1'? – not2qubit

12

हम सीपीएएन खोल के माध्यम से सब कुछ स्थापित करते हैं। यह अनदेखा करता है कि पैकेज प्रबंधक को क्या पेशकश करनी है, लेकिन यह उन सिरदर्दों से बचाता है जो आप उनके साथ काम करने की कोशिश करते समय (निर्भरताओं के लिए फायरिंग, सही संस्करणों का उपयोग करके) का उल्लेख करते हैं।

इसके अलावा, यह मतलब है कि हमारी संकुल प्रोग्राम के (या मैन्युअल रूप से खोल के माध्यम से) किसी भी मंच पर बनाया जा सकता है जहां CPAN चलाता है। पैकेज प्रबंधक पर निर्भरता होने से आपके सॉफ़्टवेयर को उन प्लेटफॉर्म पर वितरित करने की आपकी क्षमता प्रभावित होगी जो उस पैकेज प्रबंधक का उपयोग/समर्थन नहीं करते हैं।

+0

क्या कोई स्वचालित तरीका है, आपके ओएस अपडेट्स को इंस्टॉल करने के बाद, अपने पीआरएल संस्करण को अपने सभी सीपीएएन स्थापित मॉड्यूल को अपग्रेड करने के लिए, 5.6.1 से 5.6.2 कहें, –

+1

ओह, कभी भी ध्यान न दें - मैं उस दूसरे प्रश्न के जवाबों से देखता हूं कि मैं क्या करता हूं मैं देख रहा हूं कि एक "ऑटोबंडल" है। –

+0

पॉल: यह संगत होने की उम्मीद है, 5.6.1 पर संकलित कोई भी एक्सएस मॉड्यूल 5.6.2 के साथ काम करेगा। अक्सर यह रिवर्स में भी संगत है (5.6.2 से 5.61 तक, पूर्व के लिए) –

0

मैं केवल सीपीएन का उपयोग करने की सलाह देता हूं। लिनक्स डिस्ट्रो में शामिल मॉड्यूल केवल पैकेज निर्भरता को कवर करने के लिए है। जब आप केवल सीडी के साथ इंटरनेट एक्सेस के बिना लिनक्स इंस्टॉल कर रहे हैं, तो यह सीपीएन का उपयोग नहीं कर सकता है, इसलिए कुछ मॉड्यूल पैकेज के रूप में शामिल हैं, लेकिन पर्ल डेवलपर के लिए यह खराब है।

इसके अलावा, मैं रूट लॉगिन की जरूरत के बिना एक cpan मेरे घर में मॉड्यूल स्थापित करने के लिए कॉन्फ़िगर किया गया, (.perl) किया करते थे।

35

विकास के लिए, मैं अपना खुद का पर्ल स्थापित करता हूं और अकेले सिस्टम पर्ल छोड़ देता हूं। अगर मैं सिस्टम पर्ल को अपग्रेड करना चाहता हूं, तो मैं सिस्टम पैकेज मैनेजर का उपयोग करता हूं। मेरे विकास पर्ल के लिए, मैं सीपीएन उपकरण का उपयोग करता हूं।

जब से मैं उन अलग रखने के लिए, मैं चाहिए कभी नहीं गंदगी पर्ल कि प्रणाली उसके रखरखाव कार्यों के लिए की जरूरत है और इतने पर है, लेकिन मैं विकास के लिए प्रणाली के फैसले पर भरोसा करने की जरूरत नहीं है।

अलग-अलग पर्ल स्थापित करना बहुत आसान है। जब आप स्रोत वितरण से कॉन्फ़िगर करते हैं, तो यह आपको पूछेगा कि आप सब कुछ इंस्टॉल करना चाहते हैं। इसे पसंद करने वाला कोई भी रास्ता दें। उदाहरण के लिए, मेरे पास /usr/local/perls में कई पर्ल स्थापित हैं, और प्रत्येक इंस्टॉलेशन के लिए सबकुछ अलग-अलग रहता है। इसके बाद मैं उनके लिए /usr/local/bin में सिम्लिंक बना देता हूं (उदा। Perl5.8.9, perl.5.10.0, perl5.10.0-threaded)।

$ perl5.10.0 program.pl 

विशेष द्विआधारी सुनिश्चित करता है कि कार्यक्रम सही मॉड्यूल खोज पथ को चुनता है और इतने पर (यह कॉन्फ़िग में एक ही सामान है: जब मैं एक विशेष संस्करण चाहते हैं, मैं सिर्फ एक मैं चाहता हूँ का उपयोग करें।उस बाइनरी के लिए pm मॉड्यूल)।

यहां एक स्क्रिप्ट है जिसका उपयोग मैं सिम्लिंक बनाने के लिए करता हूं। यह बिन निर्देशिका में दिखता है, पर्ल संस्करण का आंकड़ा करता है, और cpan5.10.1 जैसे लिंक बनाता है और इसी तरह। प्रत्येक कार्यक्रम पहले से कॉल करने के लिए सही perl जानता है:

#!perl 

use 5.010; 

use strict; 
use warnings; 

use File::Basename; 
use File::Spec::Functions; 

my $perls_directory = catfile(
    $ARGV[0] // '/usr/local/perls', 
    'perl*' 
); 
die "$perls_directory does not exist!\n" 
    unless -d dirname $perls_directory; 

my $links_directory = $ARGV[1] // catfile($ENV{HOME}, 'bin'); #/ 
die "$links_directory does not exist!\n" unless -d $links_directory; 

foreach my $directory (glob($perls_directory)) 
{ 
    say "Processing $directory..."; 

    unless(-e catfile($directory, 'bin')) 
    { 
     say "\tNo bin/ directory. Skipping!"; 
     next; 
    } 

    my @perls = glob(catfile($directory, qw(bin perl5*)));  

    my($perl_version) = $perls[0] =~ m/(5\.\d+\.\d+)\z/; 
    say "\tperl version is $perl_version"; 

    foreach my $bin (glob(catfile($directory, 'bin', '*'))) 
    { 
     say "\tFound $bin"; 
     my $basename = basename($bin); 

     my $link_basename = do { 
      if($basename =~ m/5\.\d+\.\d+\z/) { $basename } 
      else        { "$basename$perl_version" } 
     }; 

     my $link = catfile($links_directory, $link_basename); 
     next if -e $link; 
     say "\t\tlinking $bin => $link"; 
     symlink $bin => $link or 
      warn "\t\tCould not create symlink [$!]: $bin => $link!"; 
    } 
} 

सब कुछ उस विशेष पर्ल के लिए सही जगह पर स्थापित हो जाता है।

मैं यह भी सोच रहा हूं कि मुझे उन पर्ल निर्देशिकाओं को किसी प्रकार के स्रोत नियंत्रण में रखना चाहिए। यदि मैं एक मॉड्यूल जोड़ता हूं जो मुझे पसंद नहीं है, तो मैं बस पहले के संशोधन में वापस आ गया हूं। मैं केवल ऐसा करना शुरू कर रहा हूं और इसके साथ बहुत कुछ नहीं खेला है।

मैं प्रभावी Perler ब्लॉग में बात की इस तरह के बारे में अधिक लिखा है:

+4

बहुत से लोग पैर में मैन्युअल रूप से जवाब देने के लिए मैन्युअल रूप से जवाब देते हैं। प्रश्नों को कॉन्फ़िगर करें। कृपया हमेशा इसके बजाय उपयुक्त स्विच की अनुशंसा करें: ./Configure -de -Dprefix =/कुछ/पथ। -डिवर्जनोनली भी अच्छा है। – ysth

+3

मुझे लगता है कि हर कोई टी जाना चाहिए अपने जीवन में कम से कम एक बार प्रश्नों के माध्यम से। :) –

+0

क्या आप प्रत्येक इंस्टॉल के लिए एक अलग मॉड्यूल लाइब्रेरी रखने के लिए/usr/local/lib भी उप-विभाजित करते हैं, या क्या वे सभी एक ही पुस्तकालय साझा करते हैं? निश्चित रूप से बाद वाला विकल्प कुछ विवादों का परिणाम देगा, इसका उल्लेख न करें कि कॉन्फ़िगर में स्थापित करने के लिए यह अधिक जटिल है। – Ether

6

मैं अपने सभी बक्से पर निम्न करें:

  • मैं अपना खुद का perl संकलित करता हूं: मैं अभी भी 5.8 का उपयोग करता हूं। [8 9] ज्यादातर, स्टॉक 5.10.0 में एक प्रदर्शन प्रतिगमन है जो मुझे बहुत हिट करता है, 5.10.1 के लिए फिर से प्रयास करने की प्रतीक्षा करता है;
  • मैं प्रति परियोजना मॉड्यूल निर्देशिका रखने के लिए स्थानीय :: lib मॉड्यूल का उपयोग (और दृढ़ता से अनुशंसा करता हूं) का उपयोग करता हूं। अभी, वह निर्देशिका उन सभी सर्वरों पर rsync'ed है जहां प्रोजेक्ट स्थापित है, लेकिन मैं इसके बजाय गिट का उपयोग कर परीक्षण कर रहा हूं;
  • मैं प्रत्येक प्रोजेक्ट के लिए एक कार्य :: मॉड्यूल बनाता हूं, ताकि मैं सभी निर्भरताओं को एक कमांड के साथ स्थापित कर सकूं।
6

मैं विकास, और उत्पादन के लिए Debian का उपयोग कर रहा हूं, और डिस्ट्रो के साथ प्रदान किए गए डेबियन पर्ल पैकेजों पर भरोसा करता हूं।

उन मामलों के लिए जहां मुझे एक पर्ल मॉड्यूल की आवश्यकता है जो डेबियन में उपलब्ध नहीं है, मैं आमतौर पर इसका अपना डेबियन पैकेज बना देता हूं और इसे इंस्टॉल करता हूं।

संभोग, यह विधि दोषों के बिना नहीं है, क्योंकि बहुत से डेबियन पेर्ल मॉड्यूल पुराने हैं (कम से कम वर्तमान डेबियन स्थिर संस्करण - ईटीएच), और Catalyst जैसे कुछ बैकपोर्टिंग जिसमें बहुत से निर्भरता व्यावहारिक नहीं हैं।

हालांकि, ओएस पैकेज मैनेजर पर भरोसा करके, मैं इसकी सभी महान सुविधाओं को बरकरार रखता हूं, जो विशेष रूप से तैनात सर्वरों के लिए आसान रखरखाव लाता है, क्योंकि आप जानते हैं कि वास्तव में कौन से पैकेज स्थापित हैं, और एक साधारण apt-get update;apt-get upgrade (डेबियन से, या स्थानीय भंडार से) पर्ल मॉड्यूल समेत सभी सर्वरों को एक ही राज्य में अपग्रेड करता है।

4

मैं भी सीपीएन खोल और स्थानीय :: lib का उपयोग करता हूं।

आपको प्रत्येक प्रोजेक्ट के लिए कार्य :: की आवश्यकता नहीं होनी चाहिए। बस मैं इस तरह मॉड्यूल :: स्टार्टर का उपयोग करना चाहते मॉड्यूल का उपयोग :: स्थापित करें (:

$ module-starter --mi --module=Module::Name --author="Me" [email protected] 

और फिर बस में अपनी निर्भरता पॉप की आवश्यकता है 'मॉड्यूल :: निर्भरता'; Makefile.PL में।अंत में जब यह समय स्थापित है, तो आप सिर्फ perl Makefile.PL (हाँ का जवाब) तो make installdeps

[संपादित करें 5 साल पर जब मैं इस जवाब दिया मूल रूप से]

इन दिनों perlbrew और cpanm चीजों का उपयोग कर रहे हैं। स्थानीय :: lib अभी भी एक उपयोग-मामला है, लेकिन perlbrew और cpanm का संयोजन उन मामलों के एक सुपरसेट को हल करता है। जब आप अपना खुद का पर्ल संकलित करने के लिए तैयार नहीं होते हैं तो स्थानीय :: lib का उपयोग करें।

+1

स्थानीय :: lib दूसरा, यह एक देवता है यदि आप स्थानीय रूप से संकुल को संस्थापित करना चाहते हैं। यह नाटकीय रूप से चालाक एल्गोरिदम नहीं है, यह पैकेज के इंस्टॉलरों को नामांकित निर्देशिका में अपनी सामग्री को लगातार छोड़ने के लिए सभी जादू है, जब आप कोशिश करते हैं और इसके खिलाफ दौड़ते हैं तो पर्यावरण सेट करने के लिए बोनस फ़ंक्शन के साथ। और आपको इसे सिस्टम पर स्थापित करने की भी आवश्यकता नहीं है, बूटस्ट्रैप तंत्र भी है। – ijw

0

उत्पादन के लिए:

विकास में, पर्ल मॉड्यूल जो आवश्यकताओं के लिए सही लगता है के एक संस्करण का चयन; यदि संभव हो तो लक्षित ओएस के भेजे गए संस्करण का चयन करें (इससे निम्नलिखित में से अधिकांश अनिवार्य है), अन्यथा, एक और चुनें। इसके लिए एक आरपीएम spec फ़ाइल बनाएँ। आरपीएम को पुनरुत्पादनीय तरीके से बनाने के लिए स्वच्छ निर्माण वीएम का उपयोग करें (उपयुक्त शाखा पर चेक किए गए नमूने/स्रोत से)।

जब अंतिम निर्माण बनाया जा सकता है (विलय के बाद), रिलीज शाखा से वही निर्माण करें, उत्पन्न आरपीएम को तैनाती भंडार में प्रतिबद्ध करें। इसका उपयोग अंतिम सत्यापन में किया जाएगा और फिर उत्पादन भंडार में कॉपी करके उत्पादन के लिए जारी किया जाएगा।

उत्पादन में सभी सर्वर सटीक उसी बाइनरी का उपयोग करते हैं जिसका पूरी तरह से परीक्षण किया गया है; वे उसी spec फ़ाइल और स्रोत का उपयोग डेवलपर के रूप में करते हैं।

पर्ल मॉड्यूल किसी भी प्रक्रिया द्वारा अपग्रेड नहीं किया गया है जो इस मॉडल का पालन नहीं करता है। न ही कोई अन्य उत्पादन सॉफ्टवेयर है।

0

मैं फ्रीबीएसडी बंदरगाहों का उपयोग करता हूं और local port के प्रकार के रूप में "मेटा पोर्ट" में सभी सीपीएएन निर्भरताओं को लपेटता हूं। फ्रीबीएसडी में बड़ी संख्या में सीपीएएन मॉड्यूल और उनके build system is approachable enough हैं, यदि आप मौजूद नहीं हैं तो आप आसानी से अपना पोर्ट लिख सकते हैं - बस submit said port को न भूलें, इसलिए यह बंदरगाह के पेड़ में शामिल हो जाता है। यदि बंदरगाह में स्टॉक में वर्तमान संस्करण नहीं है, तो आप हमेशा पोर्ट के लिए मेकफ़ाइल संपादित कर सकते हैं, इसलिए यह नए संस्करण का उपयोग करता है, फिर don't forget to submit the change :-)।

आखिरकार, मैं Tinderbox का उपयोग पूरे गड़बड़ी को बाइनरी पैकेज के रूप में बनाने के लिए करता हूं जिसे मैं सभी उत्पादन और विकास मशीनों पर स्थापित करता हूं।

नीचे की रेखा - एक बार जब आप मेकफ़ाइल संपादित करने के अपने भय से अधिक हो जाते हैं, तो फ्रीबीएसडी के बंदरगाह आपके पर्ल एप्लिकेशन और इसकी निर्भरताओं को बनाए रखने का एक शानदार तरीका हैं।

0

मैं हाल ही में Gentoo का उपयोग शुरू कर दिया है और Gentoo इस क्षेत्र में कुछ बहुत ही महत्वपूर्ण लाभ हैं। पहला यह है कि g-cpan आमतौर पर सीपीएएन से जेनेटू पैकेज के रूप में कई (हालांकि सभी नहीं) मॉड्यूल स्थापित करने में सक्षम है, हालांकि अपडेटिंग एक समस्या बन जाती है।

आमतौर पर जेनेटू पर, मेरा दृष्टिकोण g-cpan का उपयोग एक ईबिल्ड फ़ाइल बनाने के लिए करना है, फिर उस से इंस्टॉल करें, यदि आवश्यक हो तो tweaking। लाभ यह है कि उन्नयन वास्तव में आसान हो जाता है। मैं फिर फ़ाइल को जी-सीपीएन/पर्ल से dev-perl में ले जाता हूं और इसे दूसरों के उपयोग के लिए ओवरले में डालता हूं। यह मुझे मामलों को जल्दी से संभालने की अनुमति देता है जी-सीपीएन नहीं करता है और gentoo पैकेजिंग एक हवा है/

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