मुझे पता है कि यह पोस्ट वास्तव में पुरानी है, लेकिन अब जब कुछ समय और चींटी संस्करण पारित हो गए हैं, तो मूल चींटी सुविधाओं के साथ ऐसा करने का एक तरीका है और मुझे लगा कि मुझे इसे साझा करना चाहिए।
यह एक पुनरावर्ती macrodef के माध्यम से किया जाता है जो नेस्टेड कार्यों को कॉल करता है (यहां तक कि अन्य मैक्रोज़ भी कहा जा सकता है)। एकमात्र कन्वेंशन एक निश्चित परिवर्तनशील नाम (यहां तत्व) का उपयोग करना है।
<project name="iteration-test" default="execute" xmlns="antlib:org.apache.tools.ant" xmlns:if="ant:if" xmlns:unless="ant:unless">
<macrodef name="iterate">
<attribute name="list" />
<element name="call" implicit="yes" />
<sequential>
<local name="element" />
<local name="tail" />
<local name="hasMoreElements" />
<!-- unless to not get a error on empty lists -->
<loadresource property="element" unless:blank="@{list}" >
<concat>@{list}</concat>
<filterchain>
<replaceregex pattern="([^;]*).*" replace="\1" />
</filterchain>
</loadresource>
<!-- call the tasks that handle the element -->
<call />
<!-- recursion -->
<condition property="hasMoreElements">
<contains string="@{list}" substring=";" />
</condition>
<loadresource property="tail" if:true="${hasMoreElements}">
<concat>@{list}</concat>
<filterchain>
<replaceregex pattern="[^;]*;(.*)" replace="\1" />
</filterchain>
</loadresource>
<iterate list="${tail}" if:true="${hasMoreElements}">
<call />
</iterate>
</sequential>
</macrodef>
<target name="execute">
<fileset id="artifacts.fs" dir="build/lib">
<include name="*.jar" />
<include name="*.war" />
</fileset>
<pathconvert refid="artifacts.fs" property="artifacts.str" />
<echo message="$${artifacts.str}: ${artifacts.str}" />
<!-- unless is required for empty lists to not call the enclosed tasks -->
<iterate list="${artifacts.str}" unless:blank="${artifacts.str}">
<echo message="I see:" />
<echo message="${element}" />
</iterate>
<!-- local variable is now empty -->
<echo message="${element}" />
</target>
</project>
प्रमुख विशेषताएं जहां आवश्यक हैं:
मैंने परिसीमन परिवर्तनशील बनाने का प्रबंधन नहीं किया, लेकिन यह एक बड़ा नकारात्मक पहलू नहीं हो सकता।