这几乎肯定是重复的,但只是将其缩减为最基本的形式:
我想编写一对宏,用作:
<defined-environment>
<task-in-environment>
<task-in-environment>
...
</defined-environment>
..理想情况下,我希望能够将宏定义的包含任务与正常的Ant任务混合在一起。
唉,我似乎无法做到这一点。即使我将&lt; defined-environment&gt;的子包装器显式而不是隐式,我也会抱怨&lt;环境中的任务&gt;作为我试图缠绕它的元素的孩子,我不应该这样做。这表现得好像Ant 1.8根本不理解嵌套宏使用的概念。这是否真的如此 - Ant的宏扩展是严格的一次通过和非递归的,我实际上是否必须编写新的Ant实现代码来支持这种用法?或者是否有一些我遗漏的细节会使这成为可能?我真的希望现代宏处理器能够处理这种嵌套......
(是的,我知道macrosdefs可以调用其他宏。这不允许我需要的语法。也没有向&lt; defined-environment&gt;添加参数,因为包含的任务数量会因一次使用而异另一个。)
附录
好的,好像人们想要一个明确的例子。这不是我正在做的事情 - 我的更复杂,这就是为什么我想隐藏宏中的细节 - 但它具有相同的一般结构并证明了问题...
<macrodef name="collection">
<attribute name="id"/>
<element name="contents" implicit="yes"/>
<sequential>
<union id="@{id}">
<contents/>
</union>
</sequential >
</macrodef>
<macrodef name="mappedfile">
<attribute name="fromdir"/>
<attribute name="todir"/>
<attribute name="whichfile"/>
<sequential>
<mappedresources>
<globmapper from="*" to="@{todir}/*"/>
<fileset dir="@{fromdir}" includes="@{whichfile}"/>
</mappedresources>
</sequential >
</macrodef>
<collection id="myfiles">
<mappedfile fromdir="/actual/directory" whichfile="a.a" todir="/imaginary/directory"/>
<mappedfile fromdir="/another/directory" whichfile="b.b" todir="/imaginary/directory"/>
</collection>
生成一个名为myfiles的资源集合,它引用来自两个不同目录的文件,但假装它们都来自虚构目录。
或者应该。据我所知,没有充分的理由它不应该工作。但似乎Ant 1.8无法解决这个问题,而且我必须编写插件任务定义代码以获得我正在寻找的语法抽象。或者使用更智能的xml处理工具作为预处理器。
答案 0 :(得分:0)
无论如何......找到我的版本的解释......
ant中的宏被定义为创建任务,即使它们扩展到的标记是资源。 (修正了措辞。注意Ant不会抱怨这样的宏体;它们只是不起作用。)
Union可以将其他资源/资源集合作为子级。不是任务
Blammo。我甚至不需要嵌套的宏调用来阻止我做我想做的事情;我根本无法使用内部宏 - 这对于简化我试图支持的逻辑更为重要。
雅不能从这里到达那里。
非常感谢,伙计。