NAnt 是一个 Visual Studio .Net 应用程序的连编工具,对大而负责的工程而言,使用 NAnt 很方便。
从 http://nant.sourceforge.net 上可以下载源代码或者编译好的二进制文件,一般下载 nant-bin.zip ,解压,注册系统环境变量后,就可以使用 nant 命令了。
XML 格式,每个 build 文件包含一个 project , project 有若干 target ,每个 target 包含若干 task 。 Task 不被包含在 target 中,即直接包含在 project 中。
三个特性, name 、设置工程名称, default 、设置默认 target ,和 basedir 、如果不设置,默认为 build 文件的父目录。
执行 nant 时,可以知道 targets ,如果未指定,执行默认得 target ,如果 build 文件中未指定默认得 target ,仅仅执行全局的 task (全局的 task 总是执行),如果没有全局的 task ,那就什么都不执行了。
有五个特性, 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 执行前,这些引用会被解释出来。
一个 project 可有很多属性,这些属性可以通过 <property 任务设置在 build 文件中,也可以设置在 Nant 外。一个属性有一个 name 和一个 value ,可用于 task 的特性中,也可用于表达式,用在 task 的特性中时,使用 ${property name} 格式。 Nant 有很多内建属性(与 nant 有关的,与框架有关的,与平台有关的等)。
<property> 任务有 readonly 和 overwrite 等特性, readonly 指定属性是否是只读到,默认 false , overwirte 指定如果属性已经存在,属性值是否可以重写,默认 true,对于只读属性,是不能被重写的。注意:在 Nant 命令行指定的属性,先于在 build 文件中指定的属性,并且这些属性往往是只读的。
另外可以在 NAnt.exe.config 文件中定义全局属性。
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 文件。
表达式是一种简单而强大的机制,允许写高级的公式,用于 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> 任务实现。
命令 Nant ,此外还可以指定 build 文件名、 targets 和 properties 等。
Nant
NAnt -buildfile:..\fileName.build
NAnt clean
NAnt -D:debug=false clean dist