[
譯
]
使用屬性去控制構建(
Using Properties to Control a Build
)
???????????????????????????
???????
----
取自
<<Pro Apache Ant>>
?
為了匹配一個復雜的工程,任何構建都可能變得復雜。但是,你也許不總是想要執行構建的每個部分,或者說如果條件滿足的話,你也許想要僅僅執行某個特定的部分。當然你能夠通過使用目標依賴來創建一個構建序列,這就意味著你能將目標鏈接起來。使用這個機制,你甚至能夠集成條件,而這些條件會導致這個構建過程交叉起來,并且會創建不同的發布。例如,示例應用程序有一個
stand-alone
的
Java
客戶端和基于
Web
的接口,盡管它們共享了數據庫連接的代碼。為這個應用程序的兩個部分所做的構建起始于分離這兩個部分前的共通代碼,而分離取決于你所構建的是哪個部分。
下圖顯示了這種情形:
?
?
使用依賴來模擬這個構建過程是足夠的簡單。這樣,你總是可以對
stand-alone
目標簡單地設置
depends
特性(
attributes
)來依賴共通代碼的構建。對于
Web
應用程序目標也是一樣的。
?
一個可以替換的方案是使用
<target>
的最后兩個特性:
if
和
unless
。這兩個特性會影響到一個目標是否運行,并且運行與否會取決于屬性。設置
if
到一個屬性名意味著如果屬性被設置了,那么目標應該會運行。設置
unless
到一個屬性名意味著目標應該會運行除非該屬性被設置了。而該屬性有什么值并不重要,只要它被設置了。在
Ant
中不存在
null
。
NOTE
在
if
和
unless
特性中設置的值應該是一個屬性名,不是該屬性包含的值。不要使用
${ }
,除非你真的要設置一個屬性名作為另一個屬性的值。
?
如果
if
和
unless
都設置了相同的屬性名,那么
if
會重載
unless
,盡管你沒有絕對的理由想這么做。你也應該要意識到這些設置不會影響在
depends
特性中目標的運行。
?
但是,應用程序的構建并不總是這么簡單。例如,你也許想要獲取并構建第三方的庫,只有當你沒有它們時。這就意味著
Ant
將必須檢查某個特定的文件是否存在
build
目錄結構中;如果文件存在,那么
Ant
將跳過上圖中的前兩個步驟。這就帶來了控制構建的第一個元素:
<availabe>
。