我想写一个macrodef,它取决于在另一个macrodef中设置的属性,比如这个,这不起作用......(macrodef不支持依赖和除非属性)无论如何要做到这一点?
<project name="mac">
<property name="antlr.version" value="3.2"/>
<macrodef name="check">
<attribute name="dest"/>
<attribute name="name"/>
<attribute name="version"/>
<sequential>
<available file="@{dest}/@{name}-@{version}.jar" property="@{name}-exists"/>
</sequential>
</macrodef>
<macrodef name="pull" depends="check" unless="@{name}-exists">
<attribute name="url"/>
<attribute name="dest"/>
<attribute name="name"/>
<attribute name="version"/>
<sequential>
<get src="@{url}" dest="@{dest}/@{name}-@{version}" verbose="true" ignoreerrors="true" unless="@{name}-exists"/>
</sequential>
</macrodef>
<target name="pullall">
<pull url="http://repo1.maven.org/maven2/org/antlr/antlr/${antlr.version}/antlr-${antlr.version}.jar" dest="." name="antlr" version="${antlr.version}"/>
</target>
答案 0 :(得分:4)
这似乎有效:
<project name="mac">
<property name="antlr.version" value="3.2"/>
<property name="stringtemplate.version" value="4.0.2"/>
<target name="check">
<available file="${dest}/${name}-${version}.jar" property="jar-exists"/>
</target>
<target name="_pull" depends="check" unless="jar-exists">
<get src="${url}" dest="${dest}/${name}-${version}.jar" verbose="true" ignoreerrors="true"/>
</target>
<macrodef name="pull">
<attribute name="url"/>
<attribute name="dest"/>
<attribute name="name"/>
<attribute name="version"/>
<sequential>
<antcall target="_pull">
<param name="url" value="@{url}"/>
<param name="dest" value="@{dest}"/>
<param name="name" value="@{name}"/>
<param name="version" value="@{version}"/>
</antcall>
</sequential>
</macrodef>
<target name="pullall">
<pull url="http://repo1.maven.org/maven2/org/antlr/antlr/${antlr.version}/antlr-${antlr.version}.jar" dest="." name="antlr" version="${antlr.version}"/>
<pull url="http://repo1.maven.org/maven2/org/antlr/stringtemplate/${stringtemplate.version}/stringtemplate-${stringtemplate.version}.jar" dest="." name="stringtemplate" version="${stringtemplate.version}"/>
</target>
</project>
答案 1 :(得分:2)
即使这个问题是&#34; bit&#34;这可能对某人有所帮助:
使用ant 1.9.1 if:set除非:设置引入的属性。 https://ant.apache.org/manual/ifunless.html
这样你可以使用你的宏如下(用ant 1.9.3测试)
<project name="mac" xmlns:unless="ant:unless">
<property name="antlr.version" value="3.2"/>
<macrodef name="check">
<attribute name="dest"/>
<attribute name="name"/>
<attribute name="version"/>
<sequential>
<available file="@{dest}/@{name}-@{version}.jar" property="@{name}-exists" />
</sequential>
</macrodef>
<macrodef name="pull">
<attribute name="url"/>
<attribute name="dest"/>
<attribute name="name"/>
<attribute name="version"/>
<sequential>
<check dest="@{dest}" name="@{name}" version="@{version}" />
<get src="@{url}" dest="@{dest}/@{name}-@{version}.jar" verbose="true" ignoreerrors="true" unless:set="@{name}-exists" />
</sequential>
</macrodef>
<target name="pullall">
<pull url="http://repo1.maven.org/maven2/org/antlr/antlr/${antlr.version}/antlr-${antlr.version}.jar" dest="." name="antlr" version="${antlr.version}"/>
</target>
</project>
顺便说一句。还有其他一些使用宏的技巧和if:set / unless:set too,请参阅此处http://www.artificialworlds.net/blog/2013/09/13/using-ifset-unlessset-etc-with-macrodefs-in-ant/
如果将if / unless添加到宏的顺序体,您甚至可以模拟条件宏。