如何从另一个文件中调用macrodef

时间:2011-02-18 16:38:17

标签: ant build macrodef

我在一个单独的文件中写了一个小的macrodef:

macrodefs.xml

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

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

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

的build.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调用。

是否有可能从另一个文件中调用macrodef?

提前致谢。

1 个答案:

答案 0 :(得分:16)

您可以import该文件并使用宏,如下所示:

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

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

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

Ant macrodef task文档末尾有一些示例。

更多

Ant正在努力做的事情没有得到很好的支持。 antantcall任务不允许'被调用者'直接影响调用者。您可以在被调用的任务中写入文件,然后在调用者中加载这些文件。但正如您所观察到的,无法从目标中调用预处理任务importinclude。 ant / antcall任务只允许您在子构建中运行目标,而不是宏。

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

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

的build.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>

内的build.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)

内部构建文件可能由主构建器即时生成 - 例如,如果您要导入多个宏定义文件 - 但这可能太过笨重。