NAnt 是一個
Visual Studio .Net
應(yīng)用程序的連編工具,對大而負(fù)責(zé)的工程而言,使用
NAnt
很方便。
1.?????
安裝
從
http://nant.sourceforge.net
上可以下載源代碼或者編譯好的二進(jìn)制文件,一般下載
nant-bin.zip
,解壓,注冊系統(tǒng)環(huán)境變量后,就可以使用
nant
命令了。
2.?????
Build
文件
XML
格式,每個
build
文件包含一個
project
,
project
有若干
target
,每個
target
包含若干
task
。
Task
不被包含在
target
中,即直接包含在
project
中。
???????
Projects
(工程)
三個特性,
name
、設(shè)置工程名稱,
default
、設(shè)置默認(rèn)
target
,和
basedir
、如果不設(shè)置,默認(rèn)為
build
文件的父目錄。
執(zhí)行
nant
時,可以知道
targets
,如果未指定,執(zhí)行默認(rèn)得
target
,如果
build
文件中未指定默認(rèn)得
target
,僅僅執(zhí)行全局的
task
(全局的
task
總是執(zhí)行),如果沒有全局的
task
,那就什么都不執(zhí)行了。
???????
Targets
(目標(biāo)、對象)
有五個特性,
name
、指定名稱,
depends
、此
target
所依賴的
targets
(多個用“,”隔開),
if
、如果條件為
true
執(zhí)行此
target
,
unless
、如果條件為
true
跳過此
target
,
description
、功能的簡短描述。其中
name
必須指定。
執(zhí)行某個
target
時,首先執(zhí)行此
target
所依賴的
targets
。一個
target
可能被
depends
多次,僅執(zhí)行一次,但是通過
<call>
任務(wù)(
task
)執(zhí)行一個
target
時,此
target
及其所依賴的
targets
要重新執(zhí)行一次。另外,當(dāng)
target
的名稱被設(shè)置為“
*
”時,稱為
wild target
,一個
build
文件僅僅有一個
wild target
,在目前的
build
文件中,當(dāng)且僅當(dāng)被調(diào)用的
target
不存在時,才執(zhí)行
wild target
,主要用來處理無效的請求。
???????
Task
(任務(wù))
一塊可執(zhí)行的代碼,一個
task
可有多個特性和參數(shù)。特性的值可包含對屬性的引用,在
task
執(zhí)行前,這些引用會被解釋出來。
???????
Properties
(屬性)
一個
project
可有很多屬性,這些屬性可以通過
<property
任務(wù)設(shè)置在
build
文件中,也可以設(shè)置在
Nant
外。一個屬性有一個
name
和一個
value
,可用于
task
的特性中,也可用于表達(dá)式,用在
task
的特性中時,使用
${property name}
格式。
Nant
有很多內(nèi)建屬性(與
nant
有關(guān)的,與框架有關(guān)的,與平臺有關(guān)的等)。
<property>
任務(wù)有
readonly
和
overwrite
等特性,
readonly
指定屬性是否是只讀到,默認(rèn)
false
,
overwirte
指定如果屬性已經(jīng)存在,屬性值是否可以重寫,默認(rèn)
true
,對于只讀屬性,是不能被重寫的。注意:在
Nant
命令行指定的屬性,先于在
build
文件中指定的屬性,并且這些屬性往往是只讀的。
另外可以在
NAnt.exe.config
文件中定義全局屬性。
???????
Loggers & Listeners
Nant
通過
Loggers
和
Listeners
來監(jiān)控連編過程。
Listeners
記錄了
build started
,
build finished
,
target started
,
target finished
,
task started
,
task finished
,
message logged
事件,
Loggers
擴(kuò)展了
Listeners
,可以按
-quiet
(靜態(tài)的,平穩(wěn)的)
, -verbose
(詳細(xì)的)
, -debug
三個層次記錄連編信息,可輸出到控制臺或者文件中。
Nant
內(nèi)建了三個類:
NAnt.Core.DefaultLogger
、
NAnt.Core.MailLogger
和
NAnt.Core.XmlLogger
。使用時:
-logger
:類
-logfile
:文件名。可以是普通道文本文件或者
XML
文件。
???????
Expressions
(表達(dá)式)
表達(dá)式是一種簡單而強大的機(jī)制,允許寫高級的公式,用于
task
的參數(shù)和條件式中,這樣就可以控制連編過程了。表達(dá)式能夠訪問
project
的屬性、調(diào)用內(nèi)建的或者用戶定義的
functions
。
表達(dá)式通過
${…}
符號,可用于
task
的參數(shù)中。也可以使用標(biāo)準(zhǔn)的算術(shù)、邏輯和關(guān)系運算符。通過
prefix::function-name(argument1, ..., argumentN)
語法調(diào)用函數(shù)。訪問屬性,僅需指定其
name
(
${…}
)
例子:
訪問屬性
<property name="build.version" value="3" />
<echo message="The current date is: ${build.version}" />
調(diào)用函數(shù)
<echo message="The current date is: ${datetime::now()}" />
表達(dá)式結(jié)果存儲
<property name="autoexec-present" value="${file::exists('c:\autoexec.bat')}" />
Real-life expression use
<property name="myprj.basedir" value="c:\" />
<property name="filename" value="${path::combine(myprj.basedir,'version.txt')}" />
?
<if test="${not file::exists(filename) or file::get-length(filename) = 0}">
??? <echo message="The version file ${filename} doesn't exist or is empty!" />
</if>
有條件執(zhí)行
task
<property name="myprj.basedir" value="c:\" unless="property::exists('myprj.basedir')" />
<csc target="library" output="out.dll" ...
???? if="${datetime::now() - file::get-last-write-time('out.dll')) > timespan::from-hours(1)}">
...
</csc>
Functions
Nant
提供了操作字符串、日期時間和路徑名字的函數(shù),還提供讀取文件或者目錄屬性,訪問目前的連編信息等函數(shù)。
調(diào)用函數(shù)語法
prefix::function-name(argument1, ..., argumentN)
,需要的情況下會進(jìn)行參數(shù)類型轉(zhuǎn)換,如果轉(zhuǎn)換有誤,會報告錯誤。
自定義函數(shù)可以使用任何
.Net
語言實現(xiàn),此外還可以通過
<script>
任務(wù)實現(xiàn)。
3.?????
運行
Nant
命令
Nant
,此外還可以指定
build
文件名、
targets
和
properties
等。
Nant
NAnt -buildfile:..\fileName.build
NAnt clean
NAnt -D:debug=false clean dist