Ant 詳解
Target屬性:
name: target名字
depends:用逗號分隔的當前target所依賴的target
if/unless:執行target所需要的條件
description:對這個target的一些描述
Task屬性:
一個task是一段可執行的代碼。task可以
<!--在指定的類路徑下是否有可用的資源--> <available resource="TestTest.class"> <classpath refid="all.test.classes" /> </available>
有多個屬性(也可以叫變量)。屬性值可能包含對property的引用。這些應用會在task執行前被解析。
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" /> </target>
其中的<javac srcdir="${src}" destdir="${dest}" /> 就是一個task。
其中的 ${src} 就是對前面定義的property的引用。再執行javac 之前這些${*}會被解析。
複製文件到指定位置:
<copy file="1.txt" tofile="21.txt" /> <copy file="myfile.txt" todir="build/newdir" /> <copyfile src="test.java" dest="subdir/test.java"/> <copy todir="build/newdir"> <fileset dir="src_dir"/> </copy> <copy todir="dest/dir"> <fileset dir="src_dir" excludes="**/*.java"/> </copy>
刪除文件目錄:
<delete file="/lib/aaa.jar"/>
<delete dir="lib"/>
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
移動文件目錄:
<move todir="new/dir">
<fileset dir="src/dir">
<include name="**/*.jar"/>
<exclude name="**/aaa.jar"/>
</fileset>
</move>
重命名文件:
<rename src="foo.jar" dest="foo-${version}.jar"/>
簡歷臨時文件:
<tempfile property="temp. xml" destDir="build" suffix=".bak"/>
調用其他目錄下的build.xml:
<ant antfile="aaa/bbb/build.xml" />
<ant antfile="bbb/build.xml" dir="aaa" />
<ant antfile="build.xml" dir="aaa/bbb" />
調用其他build.xml文件中的target:
<ant antfile="subproject/subbuild.xml" target="compile"/>
使用三方的一些task:首先的導入jar文件,然後通過taskdef的classname制定哪個類來處理
taskdef
<taskdef name="if" classname="ise.antelope.tasks.IfTask" classpath="${global.dir}/../lib/atg-ant.jar" />
<taskdef name="else" classname="ise.antelope.tasks.ElseTask" classpath="${global.dir}/../lib/atg-ant.jar" />
MacroDef——“宏”,在Ant中是非常實用的,它的作用相當於java裏面的爲防止代碼重複而提取的公共方法。比如我現在需要將某幾個目錄分別進 行編譯和打包,不使用MacroDef的情況下,如果有10個目錄,那麼我就至少要寫10個類似 的<target></target>來做完對這10個目錄的操作;但在使用MacroDef的情況下,你只用寫一個通用 的<macrodef></macrodef>,再在其他地方調用它就可以了,既減少了代碼量,又提高了工作效率。
<macrodef name="macrodef">
<attribute name="target" />
<sequential>
<subant target="@{target}">
<property name="skip.run.assembler" value="true" />
<property name="cobertura.on" value="${cobertura.on}" />
<property name="junit.fullsuite" value="${junit.fullsuite}" />
<property name="sql.export.only" value="${sql.export.only}" />
<filelist refid="module.files" />
</subant>
</sequential>
</macrodef>
<filterset id="filterSet" begintoken="@" endtoken="@">
<filter token="jdbc.url" value="${jdbc.url}" />
<filter token="jdbc.pub.url" value="${jdbc.pub.url}" />
<filter token="jdbc.staging.url" value="${jdbc.staging.url}" />
</filterset>
Condition:
<target name="conditionTest"> <condition property="term"> <!--set the property value to true or false --> <!--istrue value="true" term=true--> <!--istrue value="false" term=false--> <!--isfalse value="true" term=false--> <!--isfalse value="false" term=true--> <isfalse value="true" /> </condition> <!-- 調用isTrue和isFalse這兩個target--> <antcall target="isTrue"> </antcall> <antcall target="isFalse"> </antcall> </target> <!-- if條件判斷,成立執行--> <target name="isTrue" if="term"> <echo>is ture</echo> </target> <!-- unless條件判斷,不成立時執行--> <target name="isFalse" unless="term"> <echo>is false</echo> </target>
<condition property="term"> <not> <!--邏輯非,如果istrue 爲true 那麼 term 爲false--> <istrue value="true" /> </not> </condition>
<condition property="scondition"> <or> <istrue value="true" /> <istrue value="false" /> </or> </condition>
<!--在指定的類路徑下是否有可用的資源--> <available resource="TestTest.class"> <classpath refid="all.test.classes" /> </available>
<condition property="scondition"> <!--如果屬性name不存在則返回false--> <isset property="name"/> </condition>
<condition property="scondition"> <!--如果arg1的值與arg2的值相等返回true,否則爲false--> <equals arg1="${prop1}" arg2="${prop2}"/> </condition>
判斷操作系統 與 執行腳本 :
<os family="unix" />
<condition property="isWindows">
<os family="windows" />
</condition>
如果操作系統是unix執行以下腳本
<exec executable="${app.path}/${app.name}/control/set_templates.sh" osfamily="unix" failοnerrοr="yes" />