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