编写一个简单的编译文件(Buildfile)
Ant的编译文件是用XML写的。每一个编译文件包含一个项目(project)和至少一个目标(target,可以是缺省的)。目标包含任务(task)元素。编译文件中的每一个任务元素可以有一个id属性,属性可以通过值以后被引用到。属性值是唯一的。(更多信息,参看下面的任务一节。)
工程(Projects)
[i]工程有三种属性:[/i]
---------------------------------------------------------------------------------------------------------
属性......描述.......................................................是否必须
name..... 工程的名称....................................................否
default...当没有提供目标时,使用缺省.....................................是
basedir...基础目录,从它开始计算所有的的路径。这个属性可能被先前设置的......否
.........."basedir"特性覆盖。当出现这种情况时,它必须在project标记中........
..........被删除。如果没有设置该属性或者特性,将使用编译文件的父目录。.......
---------------------------------------------------------------------------------------------------------
任意的,工程的描述可以可以被提供为顶级(top-level)的<description>元素(参看描述类型)。
每一个工程定义了一个或多个的目标。目标指你想要执行的任务的集合。当启动Ant时,可以选择想要执行的目标。当没有指定目标时,使用工程的缺省值。
目标(Tasks)
目标可以依赖于其他的目标。例如,可以使一个目标编译,一个目标生成部署。只有编译完成以后才可以部署,所以部署目标依赖于编译目标。Ant能解决这些依赖关系。
但是,需要注意的是,Ant的依赖属性(depends attribute)仅仅指目标被执行的次序,它不会影响那些指定关系的目标是否被执行,如果依赖的目标不需要运行。
Ant试图去执行目标的次序按它们的依赖属性出现的顺序(从左到右)。需要注意的是,目标可能会被提前执行当它前面的目标依赖它的时候:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假设我们想要执行目标D。从它的依赖属性看,你可能会觉得应该首先执行C,然后是B和A。错了!C依赖于B,B依赖于A,因此A首先被执行,然后是B和C,最后才是D被执行。
一个目标仅仅被执行一次,即使有多于一个目标依赖于它(参看前面的例子)。
当设置if(或者unless)特性的时候,目标有能力控制它是执行。比如,这就允许在编译的进程中有更好的控制手段,能取决于所使用的系统状态(java版本,操作系统,命令行的特性定义,等等)。为了使目标能发挥这个特性,应该加上if(或者unless)属性来指出跟目标执行有关系的特性的名字。例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
在第一个例子中,如果module-A-present特性被设置(任何值),目标将执行。在第二个例子中,如果module-A-present特性被设置(同样是任何值),目标将不被执行。
如果没有if和unless属性存在,目标将总是被执行。
可选的描述属性(description attribute)可以作为目标的一行的描述,它可以被 -projecthelp 命令行选项打印出来。没有描述的目标被视为内部的,将不被列出,除非用到-verbose或者是-debug命令。
把tstamp任务放到被其他目标依赖的,称为初始化(initialization)目标里是一个好的运用。必须确认的是,这个目标放到被依赖的其他目标中总是首先执行。在这个说明文档中,大多数的初始化目标的名字是“ init”。
[i]目标有以下的属性:[/i]
------------------------------------------------------------------------------------------------------------------
属性..........描述.....................................................是否必须
name.........目标的名字...................................................是
depends......用逗号隔开的指出所依赖的目标的名字列表.........................否
if...........为了执行目标必须要设置的特性的名字.............................否
unless.......为了执行目标不能设置的特性的名字...............................否
description...关于目标功能的简短描述......................................否
------------------------------------------------------------------------------------------------------------------
目标的名字可以是任何符合XML文件编码的字母数字串。空串"",逗号","和空格" "也在包括其中。由于它们会引起混淆,以后的Ant版本将不会支持它们,请避免使用这些。集成开发环境(IDE)支持不寻常的目标名字,或者是其他包含空格的目标名字,各种集成开发环境会有所不同。
目标以连字符开头是允许的,比如“-restart”,也可以用来命名那些不会以命令行直接调用的目标。
任务(Tasks)
任务是一小段可以执行的代码
任务可以有多个属性(或者参数,如果需要)。属性的值可以包含对特性的引用。这些引用将会先于任务被执行。
任务有通用的结构:
<name attribute1="value1" attribute2="value2" ... />
这里,name是任务的名字,attributeN是属性名,valueN是属性值。
有一系列的内部(build-in)任务,伴随着大量可选(optional)任务,但是自己写任务也是非常容易的。
所有任务都有一个任务名属性。这个属性值将用于Ant产生输出信息(logging messages)。
任务可以被id属性标记:
<taskname id="taskID" ... />
这里,taskname是任务名,taskID是任务的唯一性标识。在脚本中可以通过这个名称来指向相关的任务或其他的任务。比如,在脚本中可以这样写:
<script ... >
task1.setFoo("bar");
</script>
用来设置当前这个任务实例的foo属性。在另一个任务(用Java写的)中,可以通过project.getReference("task1")得到它的实例。
注意:1.如果“task1”没有运行,那么它将不被配置(就是说,没有属性被设置),如果它将被配置,任何对实例所做的修改都会被覆盖。
2.Ant将来的版本将不会对这个行为向后兼容(backward-compatible),因此以后大概根本没有任务实例,只有代理(proxies)。
特性(Properties)
一个工程可以有一个特性集合,这些可以在编译文件的特性任务中设置,也可在Ant以外设置。特性有名称(name)和值(value),名字是大小写敏感的。特性可以被任务的属性值用到。在属性值中,通过在特性名左右两边加“${”和“}”实现。比如,如果有一个特性“builddir”的值是“build”,它可以在属性这样使用:: ${builddir}/classes。这将在运行时被当作build/classes。
内置特性(Built-in Properties)
Ant提供对所有系统特性的访问,就像他们被当作<property>任务被定义了一样。比如,${os.name}代表操作系统的名称。
系统特性表,请参见System.getProperties的Java文档(Javadoc)。
dir 工程基础目录(basedir)的绝对路径(作为<project>的属性被设置为basedir)。
ant.file 编译文件的觉得路径。
ant.version Ant的版本号。
ant.project.name 当前被执行工程的名字。它在<project>的属性name中设置。
ant.java.version Ant所探测到的虚拟机(JVM)的版本号。当前它可能是"1.1", "1.2", "1.3"和"1.4"这些值之一。
编译文档的例子(Example Buildfile)
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
注意,这里我们在任何目标以外声明特性。<property>,<typedef> 和 <taskdef> 任务都很特别,他们可以在目标以外定义。当这样做的时候,他们都在任何任务执行前被计算。除此以外,没有其他任务能在目标以外被定义。
我们已经给出了一些目标的描述,这些将导致使用projecthelp调用命令选项时公开的目标描述被列出显示,而其他内部目标的将不被列出。
最后,目标使用到src子目录下源代码,应该被存放在跟包名相匹配的目录书中。具体细节请参考<javac>任务。
-未完待续-
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/
领测软件测试网最新更新
关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073