2012-05-07 13 views
5

में कार्यावधि में गतिशील सामग्री के साथ एक संघ और Macrodef शैली तत्व मैं एक निर्माण स्क्रिप्ट चींटी में बनाया गया है जो एक macrodef कि कुछ डिफ़ॉल्ट पैरामीटर, लक्ष्य, जड़ और की तरह, और एक वैकल्पिक दो लेता है तो है है बनाएं , extrasrc-f और extrasrc-c। आने के बाद, मैं सभी प्रासंगिक संसाधनों पर एक अपरिवर्तनीय जांच करना चाहता हूं, फिर लक्ष्य समाप्त होने पर केवल एक बिल्ड करें।चींटी

क्या मैं इस समय है,

<?xml version="1.0" encoding="UTF-8"?> 
<project name="Custom build" default="default"> 

    <taskdef resource="net/sf/antcontrib/antlib.xml" 
     classpath="C:/dev/ant/ant-contrib/ant-contrib-1.0b3.jar"/> 

    <macrodef name="checkuptodate"> 
     <attribute name="target" /> 
     <element name="resource" /> 
     <sequential> 
      <condition property="needbuild"> 
       <and> 
        <resourcecount when="greater" count="0"> <resource /> </resourcecount> 
        <not> 
         <uptodate targetfile="@{target}"> 
          <srcresources> <resource /> </srcresources> 
         </uptodate> 
        </not> 
       </and> 
      </condition> 
     </sequential> 
    </macrodef> 

    <macrodef name="projbuild"> 
     <attribute name="root" /> 
     <attribute name="target" /> 

     <element name="extrasrc-f" optional="true" /> 
     <element name="extrasrc-c" optional="true" /> 
     <sequential> 
      <local name="needbuild" /> 
      <checkuptodate target="@{root}/bin/@{target}"> 
       <resource> 
        <union> 
         <extrasrc-f /> 
         <fileset dir="@{root}/src" includes="**/*.java" /> 
        </union> 
       </resource> 
      </checkuptodate> 

      <if> 
       <istrue value="${needbuild}" /> 
       <then> 
        <javac 
         srcdir="@{root}/src" 
         destdir="@{root}/bin" 
         includeantruntime="false" 
        > 
         <extrasrc-c /> 
        </javac> 
       </then> 
      </if> 

     </sequential> 
    </macrodef> 

    <target name="default"> 

     <projbuild root="." target="EntryPoint.class"> 
      <extrasrc-f> 
       <fileset dir="Proj2/src" includes="**/*.java" /> 
       <fileset dir="Proj3/src" includes="**/*.java" /> 
      </extrasrc-f> 
      <extrasrc-c> 
       <classpath location="Proj2/src" /> 
       <classpath location="Proj3/src" /> 
      </extrasrc-c> 
     </projbuild> 

    </target> 

</project> 

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

मैंने कई चींटी चींटी और चींटी-कॉन्ट्रिब फंकी कक्षाओं के बारे में बहुत कुछ पढ़ा है, लेकिन मैंने कुछ भी नहीं पढ़ा है जो मुझे ऐसा कुछ करने की अनुमति देगा, जो मुझे अजीब लगता है, क्योंकि मेरे लिए यह एक दिखता है स्पष्ट स्थिति

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

उत्तर

0

शायद आप उन मैक्रोज़ को तोड़ने में मदद के लिए <scriptdef> कार्यों का उपयोग कर सकते हैं।

सबसे पहले, एक है कि निर्देशिका की एक अल्पविराम द्वारा पृथक सूची लेता है और उन्हें से <union> उत्पन्न करता है। आप refid की आपूर्ति करते हैं जिसका उपयोग आप संघ को id विशेषता के रूप में संदर्भित करना चाहते हैं। वैकल्पिक शामिल हैं और बहिष्कृत हैं।

कुछ
<scriptdef name="dirs2path" language="javascript"> 
    <attribute name="dirs" /> 
    <attribute name="id" /> 
    <![CDATA[ 
     var dirs = attributes.get("dirs").split(","); 

     var path = project.createDataType("path"); 
     project.addReference(attributes.get("id"), path); 

     for (var i = 0; i < dirs.length; i++) { 
      var pe = project.createDataType("path"); 
      pe.setLocation(new java.io.File(dirs[i])); 
      path.add(pe); 
     } 
    ]]> 
</scriptdef> 

एक उदाहरण उपयोग तो हो सकता है की तरह:

<scriptdef name="dirs2union" language="javascript"> 
    <attribute name="dirs" /> 
    <attribute name="id" /> 
    <attribute name="includes" /> 
    <attribute name="excludes" /> 
    <![CDATA[ 
     var dirs = attributes.get("dirs").split(","); 
     var includes = attributes.get("includes"); 
     var excludes = attributes.get("excludes"); 

     var union = project.createDataType("union"); 
     project.addReference(attributes.get("id"), union); 

     for (var i = 0; i < dirs.length; i++) { 
      var fs = project.createDataType("fileset"); 
      fs.setDir(new java.io.File(dirs[i])); 
      if (includes) 
       fs.setIncludes(includes); 
      if (excludes) 
       fs.setExcludes(excludes); 

      union.add(fs); 
     } 
    ]]> 
</scriptdef> 

दूसरा - - बहुत समान स्क्रिप्ट पथ पीढ़ी के लिए बराबर करता

<property name="dirs" value="Proj2/src,Proj3/src" /> 

<dirs2union dirs="${dirs}" id="my.union" includes="**/*.java" /> 
<dirs2path dirs="${dirs}" id="my.path" /> 

... later (e.g.) ... 

<union refid="my.union" /> 
<classpath refid="my.path" /> 

तो आप अपने मैक्रो को संशोधित कर सकता है या तो dirs विशेषता लें और आंतरिक रूप से यूनियन और क्लासपाथ उत्पन्न करें, या शायद इन्हें कहीं और उत्पन्न करें और केवल संदर्भों में पास करें।

मैं इस उदाहरण में @{root} निर्देशिका में शामिल करने का प्रयास किया नहीं है, लेकिन यह है कि के लिए ऊपर अनुकूल करने के लिए संभव हो जाना चाहिए।

+0

, ओह, धीमी प्रतिक्रिया के लिए क्षमा करें। –

+0

हाहा, मार्टिन की चिंता न करने के लिए, देर से भी, एक प्रतिक्रिया हमेशा सराहना की जाती है। चूंकि मैंने इस सवाल से पूछा, मैं अब एक ही कंपनी के साथ नहीं हूं, लेकिन मैं नियमित रूप से चींटी स्क्रिप्ट के साथ नियमित रूप से खेलता हूं, और स्क्रिप्टडेफ़ का कोई विचार नहीं था, इसके लिए बहुत बहुत धन्यवाद! – seaders