【问题标题】:Apache Ant 1.8 macro invocation nestingApache Ant 1.8 宏调用嵌套
【发布时间】:2015-03-20 15:12:14
【问题描述】:

这几乎可以肯定是重复的,但只是为了将其简化为最基本的形式:

我想写一对宏,用作:

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

【问题讨论】:

  • 你想要达到的目标的细节——以及它与简单的 macrodef-calls-macrodef 有何不同——我不清楚。
  • 这不是def调用def,而是调用包含调用。如果真的不清楚,我可以提供一个更完整的例子。我不是试图用另一个来定义一个宏,而是使用一个扩展作为另一个扩展的元素参数。换句话说,我希望 ant 用户能够嵌套这些宏的使用,就像其他返回资源集合的任务可以相互包装/聚合/过滤一样。
  • ANT 不支持嵌套宏。
  • 这就是我得出的结论,尽管这让我大吃一惊,因为这是一个很好理解的解决问题。我想我可以在调用它们之前通过一个单独的预处理器(例如样式表)来运行我的 Ant 脚本,但是......在谷仓周围的旅行应该是不必要的!
  • 如果没有提供更多详细信息的 sn-p,请不要明白你的意思,但要在 macrodef 中嵌套其他任务,您可以使用 。

标签: ant macros


【解决方案1】:

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

ant 中的宏被定义为创建任务,即使它们扩展的标签是资源。 (固定措辞。请注意,Ant 不会抱怨此类宏体;它们只是不起作用。)

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

布拉莫。我什至不需要嵌套的宏调用来阻止我做我想做的事;我根本不能使用内部宏——对于简化我试图支持的逻辑来说,这是更重要的一个。

你不能从这里到达那里。

谢谢各位。

【讨论】:

  • 好奇您认为 Ant 中宏的定义在哪里说它们扩展到资源?或者你的意思是宏的一般定义(在计算中)有这样的定义?
  • 抱歉,误读了您的评论。改进措辞以澄清。 FWIW,大多数环境中的宏都使用纯语法替换,其语义完全由其内容驱动。 Ant 的运作方式不同,这让我感到惊讶。让我烦恼;这是一个不必要的限制,它阻碍了一些非常有用的习语。
猜你喜欢
  • 2013-03-19
  • 2019-11-25
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多