Apache Ant 1.8宏调用嵌套

时间:2015-03-20 15:12:14

标签: ant macros

这几乎肯定是重复的,但只是将其缩减为最基本的形式:

我想编写一对宏,用作:

<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处理工具作为预处理器。

1 个答案:

答案 0 :(得分:0)

无论如何......找到我的版本的解释......

ant中的宏被定义为创建任务,即使它们扩展到的标记是资源。 (修正了措辞。注意Ant不会抱怨这样的宏体;它们只是不起作用。)

Union可以将其他资源/资源集合作为子级。不是任务

Blammo。我甚至不需要嵌套的宏调用来阻止我做我想做的事情;我根本无法使用内部宏 - 这对于简化我试图支持的逻辑更为重要。

雅不能从这里到达那里。

非常感谢,伙计。