2012-10-19 32 views
9

बनाता है मैं अपनी परियोजना में SNAPSHOT निर्भरताओं पर भरोसा करते हुए हेमेटिक बिल्डों को हासिल करने का प्रयास कर रहा हूं।हेर्मेटिक मेवेन बनाना

उदाहरण के प्रयोजनों के लिए, मैं एक परियोजना है जो इस तरह की एक निर्भरता संरचना है है कहते हैं: स्थानीय स्तर पर जो कुछ से संबंधित है के लिए

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

मैं करना चाहते हैं क्या सभी स्नैपशॉट निर्भरता को हल है मेरी वर्तमान संस्करण और फिर उनको मेरे नेक्सस के रिलीज रिपोजिटरी में रिलीज़ के रूप में तैनात करें। इन सभी निर्भरताओं में आंतरिक नहीं है इसलिए मैं बस प्रत्येक पर एक रिलीज नहीं कर सकता।

तो, इस उदाहरण में, other-1.2-SNAPSHOTother-1.2-mine-1.2.3 और thing-3.1-SNAPSHOT जैसे कुछ बन जाएगा thing-3.1-mine-1.2.3 बन जाएगा। यह पाइथन की लगभग 60 लाइनों में अपेक्षाकृत मामूली है।

समस्या, तथापि, ठोस संस्करणों के लिए संक्रमणीय SNAPSHOT को हल करने में है। इसलिए मुझे gizmo-6.1.3-SNAPSHOT को gizmo-6.1.3-mine.1.2.3 में कनवर्ट करने की आवश्यकता है और thing-3.1-mine-1.2.3 इस पर निर्भर है।

यह केवल एक उदाहरण है जिसमें मैं चाहता हूं कि प्राप्त करने के लिए। लक्ष्य यह है कि सड़क के नीचे एक या दो साल में मैं संस्करण 1.2.3 के लिए अपनी रिलीज शाखा की जांच कर सकता हूं और mvn clean package या लंबे समय से चलने वाले SNAPSHOT निर्भरताओं को हल करने के बारे में चिंता किए बिना पसंद कर सकता हूं।

यह महत्वपूर्ण है कि यह शाखा संकलित हो और असेंबली प्लगइन की jar-and-dependencies कार्यक्षमता जैसी किसी भी चीज़ का उपयोग करके सभी निर्भरताओं को न केवल बनाए रखें। मैं संभावित रूप से स्रोत फ़ाइलों को संशोधित करने और एक और रिलीज बनाने में सक्षम होना चाहता हूं (उदा।, हॉटफिक्स को लागू करना)।

तो,

  • इस उपलब्ध है कि एक पुनरावर्ती फैशन में स्नैपशॉट निर्भरता कन्वर्ट करने के लिए ठोस होने के लिए सक्षम हो जाएगा ऐसा कुछ है?
  • क्या कोई प्लगइन है जो आपके लिए इस तरह की चीज का प्रबंधन करता है? रिलीज प्लगइन ने अपने branch लक्ष्य पर कुछ कॉन्फ़िगरेशन विकल्पों के साथ वादा किया था, लेकिन यह बाहरी डिप्टी को उस डिग्री तक हल नहीं करता है जो मैं चाहता हूं।
  • हेमेटिक मेवेन बनाने के लिए अन्य तकनीकें उपलब्ध हैं?
+3

एक एंटी मैवेन हैक की तरह लगता है। मेवेन में, बुनियादी मौलिक नियमों में से एक है ** कॉन्फ़िगरेशन पर कन्वेंशन **। यदि निर्भरताएं स्वयं द्वारा बनाई गई हैं, तो आपको स्वयं को स्नैपशॉट/रिलीज संस्करण का प्रबंधन/उपयोग करना चाहिए। अगर वे कहीं और से हैं, तो आपको हमेशा नवीनतम रिलीज संस्करण (स्नैपशॉट संस्करण नहीं) का उपयोग करना चाहिए। [मेवेन पूर्ण संदर्भ - खंड 3.3.1] में एक दूसरा रूप लें (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -सेक्ट-संस्करण) और देखें कि क्यों मैनेन में स्नैपशॉट का उपयोग किया जाता है। – yorkw

+0

मैवेन के मूलभूत सिद्धांतों को मैं पूरी तरह से समझता हूं। हालांकि, मैं वास्तविक दुनिया में समय सीमा और तीसरे पक्ष के पुस्तकालयों के साथ रहता हूं जो अविश्वसनीय रूप से उपयोगी हैं और फिर भी विस्तारित अवधि के लिए स्नैपशॉट संस्करणों पर बैठते हैं। जेसन वैन ज़िल, जिसे आप जानते हो, यहां तक ​​कि रिलीज के आसपास एक प्रक्रिया-भारी प्रणाली की धारणा भी स्वीकार करती है, यह एक बड़ी गलती थी (और टेस्ला के साथ बदल रही है)। हमारे द्वारा उपयोग की जाने वाली सभी परियोजनाओं के आंतरिक कांटे को बनाए रखने के लिए, मैं जो कर रहा हूं वह वास्तव में सबसे अधिक होगा और वास्तव में बेहतर होगा। –

+1

असली दुनिया में भी कुछ कारणों को ध्यान में रखा जाना चाहिए। आप यहां सिस्टम से लड़ रहे हैं। जैसा कि आपने बताया है कि स्नैपशॉट्स लंबे समय तक नहीं जीते हैं - भले ही आप आर्टिफैक्ट रिज़ॉल्यूशन के लिए भरोसा करने के लिए समय-मुद्रित स्नैपशॉट का उपयोग कर रहे हों। मेरा दृष्टिकोण निर्भरता का उपयोग करेगा और सभी कलाकृतियों को पुनः प्राप्त करने के लिए प्लगइन को तैनात करेगा और ज्ञात स्नैपशॉट निर्भरताओं को एक स्क्रिप्ट या कुछ स्वयं निर्मित मेवेन प्लगइन का उपयोग कर अपने मैवेन रेपो में तैनात करेगा। हो सकता है कि अन्य गिज्मोस से बात करने में भी मदद मिलती है: यदि वे अपने कलाकृतियों के बीटा संस्करणों को जारी कर सकते हैं तो आप उन पर भरोसा कर सकते हैं जो बिना किसी गड़बड़ के हैं। – wemu

उत्तर

2

यह एक व्यापक रूप से इस्तेमाल तकनीक नहीं है, लेकिन आप हमेशा अपने विशिष्ट स्नैपशॉट निर्भरता अपने प्रोजेक्ट में एक "परियोजना" भंडार के रूप में, इस ब्लॉग पोस्ट में वर्णित के रूप में देख सकते हैं: Maven is to Ant as a Nail Gun is to a Hammer

संक्षेप में, निर्भरता प्लग इन का उपयोग अपनी परियोजना निर्देशिका में स्थित भंडार बनाने के लिए। नीचे लिंक किए गए ब्लॉग पोस्ट से कॉपी किया है (जो आप पढ़ना चाहिए):

1) भागो mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

"यह बनाता है/लक्ष्य/निर्भरता अपने सभी परियोजनाओं निर्भरता का एक रेपो की तरह लेआउट के साथ"

2) libs/

3) की तरह कुछ करने के लिए target/dependencies/ कॉपी अपने पोम के लिए निम्नलिखित की तरह एक भंडार घोषणा जोड़ें:

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 
012 सही जगह पर डाउनलोड किया निर्भरता स्थानांतरित करने के लिए AntRun प्लगइन का उपयोग कर एक जीवन चक्र phasephase को निर्भरता प्लगइन कॉन्फ़िगर करके चरण 1, और चरण 2 ..

आशा इस:

आप इस अपने निर्माण/रिलीज प्रक्रिया का एक हिस्सा बनाने के लिए स्वचालित आपके लिए काम करता है मुझे अब स्नान करना है ...

+0

मैंने यह बिल्कुल नहीं किया, लेकिन भविष्य के यात्रियों को शायद यह समाधान चाहिए। मैंने एक विशेष नेक्सस भंडार बनाया और इसमें कस्टम संस्करणों को तैनात किया और फिर एक पोस्ट के माध्यम से पोम को अपडेट किया, जैसा कि मैंने मूल पोस्ट में वर्णित किया है। मैंने अपनी आखिरी नौकरी में इस तकनीक का इस्तेमाल किया, हालांकि, और यह समान उपयोग-मामले के लिए शानदार ढंग से काम करता था। –

2

मेवेन संस्करण प्लगइन आप जो चाहते हैं उससे अधिक करेंगे।

http://mojo.codehaus.org/versions-maven-plugin/

हालांकि आप लगभग certianly एक पूर्व निर्माण कदम है जिसमें आप सभी निर्भरता को हल करने और उसके अनुसार पोम फ़ाइल का अद्यतन में इसे चलाने के लिए की आवश्यकता होगी। फिर असली निर्माण चलाने के लिए मेवेन (जो पोम को फिर से पढ़ता है) फिर से चलाएं। आप एक अलग स्क्रिप्ट से बचने के लिए स्वयं को एक अलग लक्ष्य के साथ ट्रिगर के भीतर सबकुछ कॉन्फ़िगर करने में सक्षम हो सकते हैं।

यह बेहतर काम करता है यदि आप स्नैपशॉट निर्भरताओं के बजाय विशेष संस्करणों का उपयोग करते हैं और यदि आवश्यक हो तो पूर्व-निर्माण चरण को अपग्रेड करें। निर्भरता संकल्प के लिए एकमात्र वास्तविक अंतर यह है कि मैवेन हमेशा पुनः डाउनलोड-स्नैपशॉट निर्भरताएं बनाएगा, जबकि यह एक नया संस्करण उपलब्ध होने पर ही सामान्य निर्भरता डाउनलोड करेगा। हालांकि कई प्लगइन्स (संस्करण प्लगइन समेत) इलाज-स्नैपशॉट निर्भरता अलग-अलग समस्याओं का कारण बनती है।मैं -SNAPSHOT का उपयोग के बाद से हर सीआई का निर्माण एक नया संस्करण संख्या है कभी नहीं, डेवलपर जैसी चीजों के लिए अधिक पूर्वानुमान व्यवहार के साथ -DEV की तरह एक अलग टैग पसंद की स्थानीय बनाता आदि

मैं बहुत समय बिताया है क्या करने के लिए हो रही Maven इस तरह की चीजें। अधिकांश मैवेन प्रोजेक्ट्स जो मुझे पता है संस्करण संस्करण सेट करने या इस तरह की अन्य सीमाओं के आसपास पाने के लिए किसी प्रकार का प्री-बिल्ड चरण है। यह सब एक कदम में करने की कोशिश कर आमतौर पर विफल रहता है क्योंकि मैवेन केवल एक बार पोम पढ़ता है, स्ट्रिंग प्रतिस्थापन कुछ स्थानों पर काम नहीं करता है और तैनात/स्थापित पोम में आमतौर पर स्ट्रिंग प्रतिस्थापन या किए गए परिवर्तनों के परिणाम नहीं होते हैं निर्माण के दौरान।