2012-01-26 14 views
7

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

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

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

मैं कुछ है कि काम करता है:। माता-पिता buildfile में संकलन कार्य परवाह किए बिना अतिरिक्त निर्भरता फ़ाइलसेट को दर्शाता है:

<target name="compile" depends="init-additional-dependencies"> 
    <fileset id="global.dependency.fileset" dir="${global.library.directory}"> 
    <include name="**/*.jar"/> 
    </fileset> 
    <javac ...> 
    <classpath> 
     <!-- should be the same for all buildfiles --> 
     <fileset refid="global.dependency.fileset"/> 

     <!-- should be populated by child buildfiles --> 
     <fileset refid="additional.dependency.fileset"/> 
    </classpath> 
    </javac> 
</target> 

... और अभिभावक buildfile में एक ऐसा कार्य भी है जो इस फाइलसेट को खाली बनाता है, ताकि जावैक उड़ न सके। हालांकि, जिस तरह से मैं खाली फ़ाइलसेट बना रहा हूं बासी है:

<target name="init-additional-dependencies"> 
    <!-- override me! --> 
    <fileset id="additional.dependency.fileset" dir="."> 
    <include name="placeholder.does.not.exist.so.fileset.is.empty"/> 
    </fileset> 
</target> 

यह काम करता है, लेकिन गूंगा लगता है, और यह विश्वास करना एक बेहतर तरीका नहीं है मुश्किल है। वह बेहतर दृष्टिकोण क्या है?

+0

बहुत दिलचस्प सवाल +1:

<fileset id="additional.dependency.fileset" erroronmissingdir="false" dir="noop" /> 

बच्चों कि अतिरिक्त कलाकृतियों जोड़े जाने के लिए की आवश्यकता के लिए, बच्चे के निर्माण फ़ाइल में फ़ाइलसेट को परिभाषित । परेशानी आपकी डार्टसेट का उपयोग करती है "।" जो हमेशा मौजूद है। यदि आपके पास अतिरिक्त निर्भरता जार (कहें ./deps/) रखने के लिए नामकरण सम्मेलन पर कुछ प्रकार है, तो आप 'erroronmissingdir = false' के साथ डार्टसेट बना सकते हैं। – Jayan

उत्तर

3

मुझे नहीं लगता कि इसके बारे में बहुत चर्चा हुई है, इसलिए ऐसा कोई 'सम्मेलन' मौजूद नहीं है। जिस तरह से फाइलसेट काम करता है, बहिष्करण 'ट्रम्प' समावेशन, इस प्रकार

<fileset refid="additional.dependency.fileset" dir="." excludes="**" /> 

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

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

<filelist id="additional.dependency.filelist" /> 

generalising, आप, फ़ाइलसेट और filelists मिश्रण कर सकते हैं अगर आप का उपयोग करने के resources अपने classpath संशोधित द्वारा:

<filelist id="additional.dependency.resources" /> 

... 

<classpath> 
     <!-- should be the same for all buildfiles --> 
     <fileset refid="global.dependency.fileset"/> 

     <!-- should be populated by child buildfiles --> 
     <resources refid="additional.dependency.resources"/> 
</classpath> 

संदर्भ additional.dependency.resources या तो एक फ़ाइलसेट या (खाली filelist सहित) एक filelist हो सकता है , या कोई अन्य file-based resource collection

0

माता-पिता का निर्माण फ़ाइल जोड़ें:

<fileset id="additional.dependency.fileset" dir="..." includes="..." />