課程116:Ant 的使用


摘要:

在這個課程當中,我們簡單的介紹 Ant 的使用方法。有關 Ant 的取得、安裝、以及設定,請參考附錄 B:ANT 取得、安裝、及設定。我們使用 Ant ,將上個課程所寫的程式上傳到伺服器。


Ant 的概念:

Ant 語法採用 XML 的格式。XML非常適合用來表達多階層的樹狀資料結構。Ant 的語法也承襲了這個優點。

要讓 Ant 來自動化我們的工作,我們就必須在專案的目錄中,撰寫 build.xml。

當然你可以使用其他的檔案名稱,如果使用其他檔名,就必須在命令列指定這個檔名。
假設檔名為abc.xml,命令列就必須改成:

ant -buildfile abc.xml。

build.xml 基本的結構,包含了一個文件的根節點:project;至少一個 target 節點;target節點裡再包含 task 節點來指定 Ant 所要執行的任務。視情況需要,還可以使用 property 節點,來定義 Ant 的變數。以下,分別介紹每個節點的功用。


project 節點:

project 節點是 build.xml 的文件根節點。一個文件之中,只能有一個根節點。project 節點有以下三個屬性。

屬性 說明 是否必要
name 專案名稱 No
default 假設命令列未指定 target 時,預設執行的 target 節點 Yes.
basedir 用來指定專案的根目錄,這個屬性可以使用"basedir" property 節點來改變,如果定義 basedir的 property 節點,在 project 標籤中,就不可以定義這個屬性。假使未使用這個屬性或 property 節點來定義 basedir的話,則 Ant 會使用這個專案 build.xml 的目錄,作為 basedir。 No


target 節點:

target 節點是 Ant 執行的目標,我們可以把各種命令(在 Ant 中的術語,叫任務 task),放在 target 的節點中。所以,你可以把他想成是一組命令的結合,以程式設計來說,接近副程式或不傳回值的函式。

target 和 target 之間,可以使用 depends屬性來定義彼此間的依存關係。藉由定義這些依存的關係,我們可以改變 target 的執行順序。也可以定義 if 以及 unless 屬性,來決定是否執行這個 target 節點的工作。沒有定義 if 和 unless 屬性的 target 節點,一定會按照順序執行。

屬性 說明 是否必要
name target 的名稱 Yes
depends 在執行這個 target 節點之前,先要執行其他節點的名稱。如果是多個節點時,以逗號區隔各個節點。 No
if 指定 property 名稱。必須定義這個 property ,才會執行這個 target的工作。 No
unless 指定 property 名稱。必須不定義這個 property ,才會執行這個 target的工作。 No
description 文字說明 No


task 節點:

task 節點,是 Ant 執行工作最基本的單位,類似程式設計中的命令句。可分為 core tasks 和 optional tasks 兩類,你也可以使用 java 來撰寫自定的 task。

task 的範圍很廣,各個屬性也不相同,要運用 task時,可參考 Ant 的線上說明。


property 節點:

property 節點,定義專案的屬性值,類似程式設計中的變數。最常用的屬性有 name 和 value。name 定義這個 property 的名稱,value 定義這個property 的值。要讀取 property 的值時,必須使用 ${property名稱}的格式。

範例:

<project name="ex" default="hello">

<property name="who" value="Bush"/>

<task name="hello">

<echo message="Hello, ${who} "/>

</task>

</project>


實例演練:使用 Ant 上傳檔案

我們在開發應用程式時,常常面臨需要處理很多繁瑣的工作。使用 Ant 可以幫助我們簡化這個過程。在使用 Ant 之前,你必須要先知道,你所要處理的工作有哪些。

以上個課程為例,我們要把寫完的 PHP 網頁程式,上傳到伺服器。上傳檔案這種瑣事,就可以交給 Ant 來處理。一般來說,應該是以FTP工具來執行上傳的工作,Ant 裡面所使用的 FTP task 功能不夠強大,在初次上傳的情況還好,但是,在開發過程當中,常常需要不時的更新上傳,Ant 的 FTP task 就容易因為目錄權限的問題,發生無法執行的錯誤。為了避免這個困擾,我們可以在開發測試的主機中,安裝 Samba,然後,在你的 windows 機器上,建立連線磁碟機,使用 Ant 的 copy task ,就可以解決這個問題。

 

準備工作:

在桌面上的網路上的芳鄰,按右滑鼠鍵,在選單中選擇連線網路磁碟機。指定磁碟機的名稱為 F:,路徑欄輸入\\主機名稱或 IP\帳號,如:\\libdns.lib.ncyu.edu.tw\lib13。然後,輸入帳號和密碼。這樣,在你的機器上,就有一台網路磁碟機了。

撰寫 build.xml:

進入到你的 115 資料夾之內,使用 editplus,產生一個 build.xml 檔案。

內容如下:

<project name="115" default="upload">	
<property name="dest_drive" value="F:\" />
<property name="dest_dir" value="${dest_drive}\public_html\115" /> <target name="create_dir"> <mkdir dir="${dest_dir}" /> </target> <target name="upload" depends="create_dir"> <copy todir="${dest_dir}"> <fileset dir="."> <exclude name="**\build.xml"/> </fileset> </copy> </target> </project>

執行 Ant 程式:

進入 DOS 命令列,cd 到 115資料夾,然後,在命令提示下,打 ant 按 enter 鍵。


實例演練:使用 Ant 存取資料庫

<project name="main" default="getdata">	
<property name="host" value="libdns.lib.ncyu.edu.tw" />
<property name="database" value="lib13" />
<property name="userid" value="lib13" />
<property name="password" value="password" />
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://${host}/${database}" /> <target name="create_database"> <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" src="lib13.sql" encoding="iso-8859-1" /> </target>
<target name="getdata" depends="create_database"> <sql driver="${driver}" url="${url}" userid="${userid}" password="${password}" showheaders="true" print="true" encoding="iso-8859-1"> select id, name from Guestbook </sql> </target>
</project>