《編寫可維護的JavaScript》讀書筆記之自動化-Ant
Ant
開發者通常基於他們所熟悉的工具來選擇構建工具。 Ant 最初是為 Java 專案而量身定做的構建工具,但因其簡單的 XML 語法和內建的任務,成為 JavaScript 構建工具的一個明智選擇。
安裝
執行 Ant 需要 Java 環境,所以請確保你的系統已經安裝並配置好 Java。
- Mac OS X:預設安裝了 Ant。
- Ubuntu:執行
sudo apt-get install ant
安裝 Ant。 - 其他作業系統:參照 http://ant.apache.org/manual/install.html 中的說明。
配置檔案
Ant 的主要配置檔案是 build.xml。當從命令列上執行 Ant 且未指定配置檔案時,Ant 會在當前的工作目錄中尋找這個檔案,所以最好把 build.xml 放置在專案的根目錄下。
【注意】:你不需要在該檔案中保留所有構建相關的配置資訊,但是在 Ant 執行時,build.xml 檔案必須存在。
【什麼是 build.xml】:build.xml 是一個 XML 檔案,用來告訴 Ant 如何執行構建過程。
【組成部分】:構建系統的每個部分都由一個 XML 元素表示。
- 任務:構建過程中的一個步驟,比如執行一個程式或者複製一個檔案。
- 目標:一組有序任務的集合。
- 專案:所有目標的容器。
【示例】:
<project name="projectName" default="hello">
<target name="hello">
<echo>Hello World!</echo>
</target>
</project>
【說明】:
- 每個 build.xml 檔案都是始於一個代表整個專案的 元素。必須指定 name 屬性,用來唯一標識這個專案。如果沒有明確指出要執行的目標,default 屬性所指示的目標就會被作為預設目標來執行。
- 目標由 元素來表示,name 屬性也是必需的。
- 一個專案可以有多個目標,一個目標可以有多個任務。
【推薦】:儘可能顆粒化細分目標,以便使它們可以以任何方式靈活的組合,把你想實現功能的目標當做是重複任務按照邏輯進行分組。
執行構建
只要你已經建立了 build.xml 檔案,就可以在該目錄下開啟一個命令列,然後輸入:
ant
【說明】:
- 預設情況:Ant 會讀取 build.xml 檔案並讀取 元素的 default 屬性,以確定執行哪個目標。若沒有 default 屬性,則不執行任何目標。
- 顯示指定:在命令列上通過引數顯式的指定要執行的目標。此時 Ant 會執行指定的目標,而非 default 屬性指定的預設目標。
ant hello
【輸出結果】:
Buildfile: /path/build.xml
hello:
[echo] Hello world!
BUILD SUCCESSFUL
Total time: 0 seconds
- 第一行:構建檔案的路徑。
- 中間:被執行的目標和被執行任務的列表。方括號內顯示的是任務名稱,輸出的結果在其右邊顯示。
- 倒數第二行:大寫顯示的訊息用來表示構建結果。
- 最後一行:構建所用的時間。
目標操作的依賴
每個目標都可能會被指定依賴關係——其他被依賴的目標必須在當前目標執行之前成功執行。依賴關係通過 depends 屬性來指定,多個依賴之間用半形的逗號順序分隔,被依賴的目標將首先被執行。
【示例】:
<project name="maintainablejs" default="hello">
<target name="hello">
<echo>Hello world!</echo>
</target>
<target name="goodbye" depends="hello">
<echo>Goodbye!</echo>
</target>
</project>
【輸出結果】:
ant goodbye
# 輸出結果
Buildfile: /path/build.xml
hello:
[echo] Hello world!
goodbye:
[echo] Goodbye!
BUILD SUCCESSFUL
Total time: 0 seconds
屬性
Ant 中的屬性類似 JavaScript 中的變數,因為它們通常都包含資料,這些資料在執行指令碼期間都可以被操作和改變。
【示例】:用 標籤定義一個屬性。
<project name="maintainable.js">
<property name="version" value="0.1.0" />
</project>
【說明】:每個 都需要指明 name 和 value 屬性。定義後便可通過 ${name} 來引用。
Version is ${version}
【輸出結果】:
Buildfile: /path/build.xml
version:
[echo] Version is 0.1.0
BUILD SUCCESSFUL
Total time: 0 seconds
【說明】:
- 這個特殊的 ${} 語法可以讓你在任何時候把你想要的屬性值插入到任務中。
- 屬性也可以定義在外部的 Java 屬性檔案中,並直接載入到 Ant 中。例如,假設你有一個名為 build.properties 的檔案。
version = 0.1.0
copyright = Copyright 2012 Nicholas C.Zakas. All rights reserved.
- 你可以使用 元素並通過 srcfile 屬性指明檔案路徑來把這些特性匯入 Ant 指令碼中。
<project name="maintainablejs" default="version">
<loadproperties srcfile="build.properties" />
<target name="version">
<echo>Version is ${version}</echo>
</target>
</project>
- 通過 載入的屬性與那些在 build.xml 中直接定義的屬性一樣,都可以以相同的方式訪問。對於需要定義大量的屬性或是要需要在多個 Ant 指令碼之間公用的屬性而言,最好把它們放在一個獨立的 Java 屬性檔案中。
【建議】:最好至少宣告幾個可用於整個專案的屬性。
- src.dir:原始碼目錄的根目錄。
- build.dir:放置最終構建後文件的路徑。
- lib.dir:依賴檔案的路徑。
Buildr 專案
Buildr 是一個尋找和收集前端相關且語法簡單的 Ant 任務的開源專案。雖然對於處理 JavaScript 檔案而言有很多工具可以選擇,但是它們之間都有一些不同。Buildr 囊括了所有這些可能在你的 Ant 指令碼中使用到的各種工具,把它們封裝成了任務(tasks)。