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.jarantlib.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}"/>