NAnt 是一个Visual Studio .Net应用程序的连编工具,对大而负责的工程而言,使用NAnt很方便。
1. 安装
从http://nant.sourceforge.net上可以下载源代码或者编译好的二进制文件,一般下载nant-bin.zip,解压,注册系统环境变量后,就可以使用nant命令了。
2. Build文件
XML格式,每个build文件包含一个project,project有若干target,每个target包含若干task。Task不被包含在target中,即直接包含在project中。
Ø Projects(工程)
三个特性,name、设置工程名称,default、设置默认target,和basedir、如果不设置,默认为build文件的父目录。
执行nant时,可以知道targets,如果未指定,执行默认得target,如果build文件中未指定默认得target,仅仅执行全局的task(全局的task总是执行),如果没有全局的task,那就什么都不执行了。
Ø Targets(目标、对象)
有五个特性,name、指定名称,depends、此target所依赖的targets(多个用“,”隔开),if、如果条件为true执行此target,unless、如果条件为true跳过此target,description、功能的简短描述。其中name必须指定。
执行某个target时,首先执行此target所依赖的targets。一个target可能被depends多次,仅执行一次,但是通过<call>任务(task)执行一个target时,此target及其所依赖的targets要重新执行一次。另外,当target的名称被设置为“*”时,称为wild target,一个build文件仅仅有一个wild target,在目前的build文件中,当且仅当被调用的target不存在时,才执行wild target,主要用来处理无效的请求。
Ø Task(任务)
一块可执行的代码,一个task可有多个特性和参数。特性的值可包含对属性的引用,在task执行前,这些引用会被解释出来。
Ø Properties(属性)
一个project可有很多属性,这些属性可以通过<property任务设置在build文件中,也可以设置在Nant外。一个属性有一个name和一个value,可用于task的特性中,也可用于表达式,用在task的特性中时,使用${property name}格式。Nant有很多内建属性(与nant有关的,与框架有关的,与平台有关的等)。
<property>任务有readonly和overwrite等特性,readonly指定属性是否是只读到,默认false,overwirte指定如果属性已经存在,属性值是否可以重写,默认true,对于只读属性,是不能被重写的。注意:在Nant命令行指定的属性,先于在build文件中指定的属性,并且这些属性往往是只读的。
另外可以在NAnt.exe.config文件中定义全局属性。
Ø Loggers & Listeners
Nant 通过Loggers和Listeners来监控连编过程。Listeners记录了build started,build finished,target started,target finished,task started,task finished,message logged事件,Loggers扩展了Listeners,可以按-quiet(静态的,平稳的), -verbose(详细的), -debug三个层次记录连编信息,可输出到控制台或者文件中。Nant内建了三个类:NAnt.Core.DefaultLogger、NAnt.Core.MailLogger和NAnt.Core.XmlLogger。使用时:-logger:类 -logfile:文件名。可以是普通道文本文件或者XML文件。
Ø expression_r_rs(表达式)
表达式是一种简单而强大的机制,允许写高级的公式,用于task的参数和条件式中,这样就可以控制连编过程了。表达式能够访问project的属性、调用内建的或者用户定义的functions。
表达式通过${…}符号,可用于task的参数中。也可以使用标准的算术、逻辑和关系运算符。通过prefix::function-name(argument1, ..., argumentN)语法调用函数。访问属性,仅需指定其name(${…})
例子:
访问属性
<property name="build.version" value="3" />
<echo message="The current date is: ${build.version}" />
调用函数
<echo message="The current date is: ${datetime::now()}" />
表达式结果存储
<property name="autoexec-present" value="${file::exists('c:/autoexec.bat')}" />
Real-life expression_r_r 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>
有条件执行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提供了操作字符串、日期时间和路径名字的函数,还提供读取文件或者目录属性,访问目前的连编信息等函数。
调用函数语法prefix::function-name(argument1, ..., argumentN),需要的情况下会进行参数类型转换,如果转换有误,会报告错误。
自定义函数可以使用任何.Net语言实现,此外还可以通过<script>任务实现。
3. 运行Nant
命令Nant,此外还可以指定build文件名、targets和properties等。
Nant
NAnt -buildfile:../fileName.build
NAnt clean
NAnt -D:debug=false clean dist