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
文件。
Ø
Expressions
(表达式)
表达式是一种简单而强大的机制,允许写高级的公式,用于
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 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