我在一个单独的文件中写了一个小的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?
提前致谢。
答案 0 :(得分:16)
您可以import
该文件并使用宏,如下所示:
<import file="macrodefs.xml" />
<do-cool-stuff message="Hello, World!" />
请注意,在宏定义中,您应该在引用宏属性时使用@{curlybrackets}
:
<sequential>
<echo message="@{message}" />
</sequential>
Ant macrodef
task文档末尾有一些示例。
更多的
Ant正在努力做的事情没有得到很好的支持。 ant
和antcall
任务不允许'被调用者'直接影响调用者。您可以在被调用的任务中写入文件,然后在调用者中加载这些文件。但正如您所观察到的,无法从目标中调用预处理任务import
和include
。 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)
内部构建文件可能由主构建器即时生成 - 例如,如果您要导入多个宏定义文件 - 但这可能太过笨重。