2012-10-09 18 views
5

मेरे पास एक ग्राहक और सर्वर है जिसे मैं चींटी के साथ बना रहा हूं। क्लाइंट इसे बनाने से पहले सर्वर पर पहले बनाया जा रहा है। मेरे पास क्लाइंट में बंडल किए गए सर्वर कान फ़ाइल को छोड़कर सभी आवश्यक पुस्तकालय हैं।एंटी बिल्ड फाइलों को जोड़ना

मैंने 3 चींटी फाइलें build.xml, build-client.xml, और build-server.xml बनाई। (उन्हें देखने के लिए किसी भी फ़ाइल नाम पर क्लिक करें) build-client.xml और build-server.xmlbuild.xml में शामिल हैं ताकि यह उनसे लक्ष्य चला सके।

मेरी समस्या यह है कि basedir फ़ाइल बनाने के लिए फ़ाइल फ़ाइल से परिवर्तनीय परिवर्तन। इसलिए यदि में build.xml से लक्ष्य चलाते हैं तो आधारित चर build.xml से संबंधित है।

मैं एंट स्क्रिप्ट के भीतर कई बार आधारित चर बदल सकता हूं?

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

उत्तर

5

था ant documentation<import> के लिए काम तुम ऐसा कैसे पूरा करने के लिए के बारे में जानकारी देता है।

आयात की गई फ़ाइल

के खिलाफ समाधान किया जा रहा फ़ाइलें बुलाया आपका मुख्य निर्माण फ़ाइल importing.xml निर्माण फ़ाइल imported.xml, फाइल सिस्टम पर कहीं भी स्थित आयात करता है मान लीजिए, और imported.xml सम्पत्तियों का एक समूह पढ़ता आयातित से। गुण:

<!-- importing.xml --> 
<project name="importing" basedir="." default="..."> 
    <import file="${path_to_imported}/imported.xml"/> 
</project> 

<!-- imported.xml --> 
<project name="imported" basedir="." default="..."> 
    <property file="imported.properties"/> 
</project> 

यह स्निपेट हालांकि, importing.xml की basedir के खिलाफ imported.properties हल क्योंकि imported.xml की basedir चींटी द्वारा नजरअंदाज कर दिया है होगा। आयातित करने का सही तरीका।गुण है:

<!-- imported.xml --> 
<project name="imported" basedir="." default="..."> 
    <dirname property="imported.basedir" file="${ant.file.imported}"/> 
    <property file="${imported.basedir}/imported.properties"/> 
</project> 

रूप ${ant.file.imported} दुकानों का निर्माण स्क्रिप्ट का पथ, कि इस परियोजना आयातित कहा जाता है, (संक्षेप में यह पथ संग्रहीत करता imported.xml के लिए) और <dirname> अपनी निर्देशिका लेता है परिभाषित करता है कि ऊपर बताया गया। यह तकनीक imported.xml को स्टैंडअलोन फ़ाइल के रूप में उपयोग करने की अनुमति देती है (अन्य प्रोजेक्ट में आयात किए बिना)।

असल में, तुम सच में ${basedir} चर, और न ही अपनी परियोजना टैग में basedir="./../GrahamsProjClient" विशेषता का उपयोग नहीं कर सकते हैं, लेकिन इसके बजाय आप इसे का निर्माण कर सकते हैं:

<!-- build-client.xml --> 
<project name="GPClient" default="dist" > 

    <dirname property="client.root.dir" file="${ant.file.GPClient}"/> 
    <property name="real.basedir" value="${client.root.dir}/../GrahamsProjClient"/> 

    <!-- Then from then on, replace ${basedir} with ${real.basedir} --> 
    ... 
</project> 

आप निर्माण सर्वर के लिए भी ऐसा ही कर सकते हैं। एक्सएमएल, देखने के लिए एकमात्र चीज यह है कि <dirname /> के लिए प्रोजेक्ट नाम ${ant.file.[project name]} फ़ाइल विशेषता में दिखाया गया है।

0

एक बात मैं चींटी के साथ देखा समाधान प्रत्येक लक्ष्य आप करना चाहते थे के लिए कमांड लाइन से चींटी चलाने के लिए किया गया है कि मैं चर बदलने के लिए नहीं मिल सका था जैसे मैं

चाहता था, इसलिए बजाय कर रही है एक कमांडलाइन बयान ऐसे

ant target1 target2

या

<target name="target1"> 
    <antcall target="target2"> 
</target> 

के रूप में मैं बजाय लक्ष्य करना था sequ कॉल कमांड लाइन ant target1 ant target2

तो मैं एक अजगर स्क्रिप्ट के भीतर इन चींटी कॉल डाल पर विकल्प चुना से entially, कि बस os.system(""); कॉल, जहाँ मेरे कमांडलाइन बयान उद्धरण के भीतर किया जाएगा बनाता है। बैश ऐसा कर सकता है भी

इस एक ही तरीका है कि चींटी प्रत्येक लक्ष्य के लिए उचित चर का उपयोग होता है, अगर उन चर एक ही नाम

3

मेरा सामान्य नियम सामान्य निर्माण प्रक्रिया में <ant> या <subant> का उपयोग नहीं करना है क्योंकि यह निर्भरता जांच को तोड़ता है। हमने डेवलपर को बिल्ड.एक्सएमएल को सात अलग-अलग बिल्ड फाइलों में तोड़ दिया था, और अन्य बिल्ड फाइलों में सामान करने के लिए <ant> कार्यों की निरंतर कॉलिंग के कारण, वह 14 बार तक एक ही लक्ष्य को निष्पादित कर रहा था। और, फिर उसने सोचा कि उसका निर्माण इतना लंबा क्यों ले रहा था। सात बिल्ड फ़ाइलों को एक साथ build.xml में एक साथ जोड़कर depends<target> पैरामीटर का उपयोग करके निर्माण को दो मिनट से भी कम समय तक छोटा कर दिया गया।

हालांकि, इस मामले में आपके पास वास्तव में दो अलग-अलग परियोजनाएं हैं और एक build.xml है जिसे आप उन दो अलग-अलग परियोजनाओं को कॉल करने के लिए उपयोग कर रहे हैं। इस मामले में, से <ant> और <subant> कॉल का उपयोग करके आप बेहतर हैं।

  • ये कॉल ${basedir} में हस्तक्षेप नहीं करेंगे।
  • ये कॉल आपको यह निर्दिष्ट करने की अनुमति देते हैं कि आप इन अलग-अलग फ़ाइलों में कौन से गुण और संसाधन शामिल करना चाहते हैं। (संभावित उत्तर कोई नहीं) है।
  • आपको एक ही नाम साझा करने वाले एकाधिक लक्ष्यों के साथ कोई समस्या नहीं है। आपके क्लाइंट बिल्ड में संकलित लक्ष्य आपके सर्वर निर्माण में _compile_ लक्ष्य को ओवरलैप नहीं करेगा।

सुबंट अधिक शक्तिशाली है, लेकिन कार्यान्वित करने के लिए कठिन है। सुबांत के साथ, आप इसे build.xml फ़ाइलों के लिए खोज सकते हैं। <ant> का उपयोग करने में अधिकांश समय बस आसान होता है और जो भी आप चाहते हैं वह करता है।


मैं वास्तव में सिफारिश करता हूं कि निर्भरता के मुद्दों को संभालने के लिए आइवी का उपयोग करना है। न केवल आईवी आपके क्लाइंट में सर्वर निर्भरता को संभाल सकता है, बल्कि यह सभी तृतीय पक्ष जार निर्भरताओं को भी संभाल सकता है। आपकी परियोजनाओं में और अधिक भंडारित जर्फ़ाइल नहीं। जब आप किसी प्रोजेक्ट में जार फ़ाइलों को स्टोर करते हैं, तो आप उनके वास्तविक संस्करण और उनके इतिहास के बारे में जानकारी खो देते हैं। आप अपनी परियोजना में commons-io.jar देखते हैं, और आपको पता नहीं है कि यह कौन सा संस्करण था या यहां तक ​​कि यदि यह आधिकारिक 'कॉमन्स-io.jar है, या आपके डेवलपर्स में से एक ने इसे किसी बिंदु के रूप में मंग किया है।

समस्या यह है कि आईवी लागू करने के लिए थोड़ा सा काम करता है। आपको Nexus, Artifactory, या Archiva जैसे आइवी रिपोजिटरी मैनेजर का उपयोग करने की आवश्यकता है। (असल में, ये मेवेन रिपोजिटरी प्रबंधक हैं, लेकिन आइवी उनके साथ काफी अच्छी तरह से काम करता है।)

फिर, आप अपने Maven आइवी भंडार सर्वर को इंगित करने के लिए अपने प्रोजेक्ट में ivy.jar आयात और ivysettings.xml फ़ाइल प्राप्त करने की आवश्यकता।

आप अपने संस्करण नियंत्रण प्रणाली के रूप में सबवर्सन का उपयोग करते हैं, तो आपको निम्न कर सकते हैं:

  • एक आइवी परियोजना है कि ivy.jar शामिल है, और एक एक्सएमएल फ़ाइल है कि सब कुछ सेट अप आप के लिए बनाएँ। मेरे पास Github में से एक है जिसे आप देख सकते हैं। एक्सएमएल फ़ाइल को ivy.tasks.xml कहा जाता है।
  • फिर अपनी परियोजना में, इस परियोजना को आयात करने के लिए svn:externals का उपयोग करें। अपने <project> इकाई में
    • आइवी नाम स्थान जोड़ें:
    • अपने build.xml में, आप दो काम करने की जरूरत है।
    • आईवी एक्सएमएल फ़ाइल आयात करने के लिए <import> कार्य का उपयोग करें जिसमें सब कुछ सेटअप है।

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

एक आप, आप सरल एक ivy.xml फ़ाइल है कि आपके निर्भरता को परिभाषित करता है बनाते हैं, और <ivy:cachepath> और <ivy:retrieve> का उपयोग तृतीय पक्ष जार आप की जरूरत को पुनः प्राप्त करने के लिए क्या। इसमें आपके क्लाइंट की ज़रूरत वाले सर्वर जार शामिल होंगे।

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