自 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}"/>