課程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>