PreSetDef

自 Apache Ant 1.6 起

描述

预设定义根据当前定义生成一个新的定义,其中一些属性或元素被预设。

任何属性或嵌套文本中属性的解析是在使用定义时进行的,而不是在定义预设定义时进行的。

参数

属性 描述 必需
name 新定义的名称
uri 此定义应该所在的 URI。

作为嵌套元素指定的参数

具有属性或元素设置的另一种类型

<presetdef> 任务接受一个嵌套元素作为参数。此嵌套元素可以是任何其他类型或任务。需要预设的属性和元素放置在此处。

示例

以下片段定义了一个 javac 任务,其中设置了 debugdeprecationsrcdirdestdir 属性。它还有一个 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}"/>