12

我在单独的文件中写了一个小宏定义:

宏定义.xml

<macrodef name="do-cool-stuff">
  <attribute name="message"/>

  <sequential>
    <echo message="@{message}" />
  </sequential>
</macrodef>

我有第二个文件,我的主要构建文件:

构建.xml

<target name="build">
  <!-- do this and that -->

  <!-- cheking out macrodefs.xml via CVS -->

  <ant antfile="macrodefs.xml" target="do-cool-stuff" >
    <property name="message" value="Hello, World!" />
  </ant>
</target>

正如您可能猜到的那样,这不起作用。错误消息类似于:

Target 'do-cool-stuff' does not exist in this project.

我找到的唯一可能的解决方案是在 macrodefs.xml 中提供一个额外的目标来转发 ant 调用。

是否有可能从另一个文件中调用宏定义?

提前致谢。

4

1 回答 1

19

您可以import像这样文件并使用宏:

<import file="macrodefs.xml" />
<do-cool-stuff message="Hello, World!" />

请注意,在宏定义中,您应该@{curlybrackets}在引用宏属性时使用:

<sequential>
    <echo message="@{message}" />
</sequential>

macrodefAnt任务文档的末尾有一些示例。

更多的

Ant 不太支持您尝试做的事情。antandantcall任务不允许“被调用者”直接影响调用者。您可以在被调用任务中写入文件,然后在调用者中加载这些文件。import但是正如您所观察到的,预处理任务include不能从目标中调用。ant/antcall 任务只允许您在辅助构建中运行目标,而不是宏。

一种解决方法(这可能与您提到的类似,但允许您将所有实际工作放在顶级构建中)是拥有一个内部构建文件,其中包含 macrodefs.xml 的顶级导入。

类似于以下内容。macrodefs.xml 文件和以前一样。(但请注意,导入的文件 - 包括宏定义 - 需要是完整的 Ant 项目文件,因此它们必须包含项目元素。)

构建.xml:

<target name="build">
    <!-- cvs actions -->
    <ant antfile="inner-build.xml" target="target-runner">
        <property name="target" value="top-target" />
    </ant>
</target>

<!-- this target will fail unless invoked from the inner build -->
<target name="top-target">
    <do-cool-stuff message="Hello, World!" />
</target>

内部构建.xml:

<project>
    <import file="macrodefs.xml" />

    <target name="target-runner">
        <ant antfile="build.xml" target="${target}" />
    </target>
</project>

实际上你会做

build.xml --> inner-build.xml --> build.xml (again)
(cvs)         (import macros)     (use macros)

内部构建文件可能会由主构建动态生成 - 例如,如果您想导入多个宏定义文件 - 但这可能太笨拙了。

于 2011-02-18T17:08:26.133 回答