Apache Ant 1.8 宏调用嵌套
Apache Ant 1.8 macro invocation nesting
这几乎可以肯定是重复的,但只是为了将其简化为最基本的形式:
我想写一对宏,用作:
<defined-environment>
<task-in-environment>
<task-in-environment>
...
</defined-environment>
.. 理想情况下,我希望能够将宏定义的包含任务任务与普通 Ant 任务混合。
唉,我似乎无法完成这项工作。即使我使 的子包装器显式而不是隐式,我也会收到投诉,认为 不应该是我试图包装它的元素的子元素。这表现得好像 Ant 1.8 根本不理解嵌套宏用法的概念。
这真的是真的吗 -- Ant 的宏扩展是否严格是一次性的和非递归的,我真的必须编写新的 Ant 实现代码来支持这种用法吗?还是我遗漏了一些细节,这将使这成为可能?我真的希望现代宏处理器能够处理这种嵌套...
(是的,我知道 macrosdefs 可以调用其他宏。这不允许我需要的语法。也不会向 添加参数,因为包含的任务数量会因一种用法而异.)
附录
好的,看起来人们想要一个明确的例子。这不是我正在做的——我的更复杂,这就是为什么我想在宏中隐藏细节——但它具有相同的一般结构并演示了问题...
<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处理工具作为预处理器
无论如何,我的版本都找到了解释...
ant 中的宏被定义为创建任务,即使它们扩展到的标签是资源。 (固定的措辞。请注意,Ant 不会抱怨此类宏体;它们只是不起作用。)
Union 可以将其他 resources/resource 集合作为子集合。不是任务
布拉莫。我什至不需要嵌套的宏调用来阻止我做我想做的事;我根本无法使用内部宏——这是简化我试图支持的逻辑的更重要的宏。
你无法从这里到达那里。
谢谢大家。
这几乎可以肯定是重复的,但只是为了将其简化为最基本的形式:
我想写一对宏,用作:
<defined-environment>
<task-in-environment>
<task-in-environment>
...
</defined-environment>
.. 理想情况下,我希望能够将宏定义的包含任务任务与普通 Ant 任务混合。
唉,我似乎无法完成这项工作。即使我使
这真的是真的吗 -- Ant 的宏扩展是否严格是一次性的和非递归的,我真的必须编写新的 Ant 实现代码来支持这种用法吗?还是我遗漏了一些细节,这将使这成为可能?我真的希望现代宏处理器能够处理这种嵌套...
(是的,我知道 macrosdefs 可以调用其他宏。这不允许我需要的语法。也不会向
附录
好的,看起来人们想要一个明确的例子。这不是我正在做的——我的更复杂,这就是为什么我想在宏中隐藏细节——但它具有相同的一般结构并演示了问题...
<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处理工具作为预处理器
无论如何,我的版本都找到了解释...
ant 中的宏被定义为创建任务,即使它们扩展到的标签是资源。 (固定的措辞。请注意,Ant 不会抱怨此类宏体;它们只是不起作用。)
Union 可以将其他 resources/resource 集合作为子集合。不是任务
布拉莫。我什至不需要嵌套的宏调用来阻止我做我想做的事;我根本无法使用内部宏——这是简化我试图支持的逻辑的更重要的宏。
你无法从这里到达那里。
谢谢大家。