自 Apache Ant 1.6 起
预设定义根据当前定义生成一个新的定义,其中一些属性或元素被预设。
任何属性或嵌套文本中属性的解析是在使用定义时进行的,而不是在定义预设定义时进行的。
| 属性 | 描述 | 必需 |
|---|---|---|
| name | 新定义的名称 | 是 |
| uri | 此定义应该所在的 URI。 | 否 |
<presetdef> 任务接受一个嵌套元素作为参数。此嵌套元素可以是任何其他类型或任务。需要预设的属性和元素放置在此处。
以下片段定义了一个 javac 任务,其中设置了 debug、deprecation、srcdir 和 destdir 属性。它还有一个 src 元素,用于从生成的目录中获取源文件。
<presetdef name="my.javac">
<javac debug="${debug}" deprecation="${deprecation}"
srcdir="${src.dir}" destdir="${classes.dir}">
<src path="${gen.dir}"/>
</javac>
</presetdef>
这可以用作普通的 javac 任务,例如
<my.javac/>
在预设任务中指定的属性可以被覆盖,即它们可以被视为可选属性,例如
<my.javac srcdir="${test.src}" deprecation="no"/>
可以在 antlib 中放置 presetdef 定义。例如,假设 jar 文件 antgoodies.jar 具有以下 antlib.xml
<antlib>
<taskdef resource="com/acme/antgoodies/tasks.properties"/>
<!-- Implement the common use of the javac command -->
<presetdef name="javac">
<javac deprecation="${deprecation}" debug="${debug}"
srcdir="src" destdir="classes"/>
</presetdef>
</antlib>
然后可以在构建文件中使用它,如下所示
<project default="example" xmlns:antgoodies="antlib:com.acme.antgoodies">
<target name="example">
<!-- Compile source -->
<antgoodies:javac srcdir="src/main"/>
<!-- Compile test code -->
<antgoodies:javac srcdir="src/test"/>
</target>
</project>
以下是在使用定义时评估属性的示例
<target name="defineandcall">
<presetdef name="showmessage">
<echo>message is '${message}'</echo>
</presetdef>
<showmessage/>
<property name="message" value="Message 1"/>
<showmessage/>
<antcall target="called">
<param name="message" value="Message 2"/>
</antcall>
</target>
<target name="called">
<showmessage/>
</target>
命令 ant defineandcall 导致输出
defineandcall:
[showmessage] message is '${message}'
[showmessage] message is 'Message 1'
called:
[showmessage] message is 'Message 2'
可以使用一个技巧在定义生成时而不是使用时评估属性。如果您不希望某些属性在使用 <ant ... inheritall="false"> 运行的子构建中可用,这将很有用。
<macrodef name="showmessage-presetdef">
<attribute name="messageval"/>
<presetdef name="showmessage">
<echo>message is '@{messageval}'</echo>
</presetdef>
</macrodef>
<showmessage-presetdef messageval="${message}"/>