点击此处下载StartWithAnt完整的pdf文档与代码:http://download.csdn.net/detail/sodino/6603769
1.project
project元素有三个属性。
name表示当前工程名称;
当Ant被调用时,如果没有指定执行具体的目标(target),则default将指定要执行的目标;
basedir用于指定Ant的基础目录,Ant中所有的相对路径都将以此值为基础进行计算。
这三个元素都不是必备的,但为了方便工程的执行,通常都会对default进行赋值。在代码1.1 中,直接就支接运行了Echo目标打印“Hello world!”。
2.target
target是一系列task任务的有序集合。
1. target的分类:
属性description为当前目标(target)处理的业务逻辑进行描述。有被赋值的目标(target)称为Main Target。未被声明的则为Subtarget。通过命令行:ant –f buildfile.xml –projecthelp可以将target区分开来。
<target name="Echo" description="Just print 'Hello world'.">
<echo message="Hello world! I'm ant."></echo>
</target>
<target name="EchoSubTarget"/>
代码2.1 Target分类
图2.1 Target分类
由上图可看出,Main Target清单中有”Echo”,并做出了描述;但未对description赋值的target:EchoSubTarget并没有被打印出来。
2. target具有依赖特性
先给出一段代码,如下:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
代码2.2 target的依赖特性
2.1 target的依赖关系
属性”depends”可以决定target之间依赖关系;并且不限定依赖个数,即一个子target可以同时依赖多个父target。
2.2 target多重依赖的调用顺序
假若要执行D,由于C依赖自B,B依赖自A,所以这些target的调用顺序会是:AàBàCàD。
2.3 target多次依赖的调用次数
D依赖了A、B、C,但由于C与A、B及B与A的依赖关系,在执行D时前的初始化操作中,A、B、C都仅会且仅会被执行一次。并不会因为D中刻意声明依赖自B和A会再单独执行B、A,因为C的初始化操作中已经执行过一次了。
2.4 依赖的传承
在A声明的数据元素,包括特性(property)和Data Type,或时间戳(tstamp)等仍可以在B、C、D中使用。
在下面的代码中,默认目标target为D。当Ant执行此文件,由于D的依赖关系,会依次调用A、B、C,并且A、B、C都只会被调用一次。而D作为最底层的依赖目标target,可以直接使用上层被依赖target内的所有数据元素。
<target name="A" description="First Class A">
<property name="a.value" value="Apple" />
<echo message="I'm a ${a.value}."></echo>
</target>
<target name="B" description="First Class B" depends="A">
<property name="b.value" value="Bee" />
<echo message="I'm a ${b.value}."></echo>
</target>
<target name="C" description="First Class C" depends="B">
<property name="c.value" value="Car" />
<echo message="I'm a ${c.value}."></echo>
</target>
<target name="D" description="First Class D" depends="C,B,A">
<echo message="a.value=${a.value}"/>
<echo message="b.value=${b.value}"/>
<echo message="c.value=${c.value}"/>
</target>
代码2.3 依赖关系示例
图2.3 依赖关系示例
以上示例代码见build_02.2_depends.xml。
3.project与target的小关系
每个Ant文件由单个的project元素组成,该元素可以包含一个或多个target元素。一个目标(target)是生成过程中已定义的一个步骤,可以定义任意数量的操作,比如编译源代码,对Apk进行签名等。这些操作本身由其他专用任务(Task)标签执行。通常为了编写的灵活性,把数量较多的操作根据其业务逻辑划分到单独的目标(target)元素中,这样可以有选择性的执行整体生成过程中的单独部分。例如,可以调用某些目标元素,直接对安装包进行重新签名,而不需要从头执行编译操作。
4.task
task是指一系列内嵌在target的任务元素。用它来处理具体的业务操作。在上面的例子中,已经使用到打印输出的任务task:“echo”。
5.数据元素
Ant中数据元素可以分为两类:特性和Data Type。
特性(property)表示字符串数据的名-值对。除了字符串以外,任何其他数据类型均不能与特性相关联。下面的第三章将会专门用来讲解特性的使用。
Data Type的出现解决了批量的路径和文件列表定义用多个特性值表示相当繁琐的问题。Ant中支持的Data Type有:argument、environment、filelist、fileset、filterset、path、mapper。
6.Ant自检顺序
Ant构建文件定义了一个project及一个或多个target,而target内又可以包含一个或多个task。用Xml表示了一个层次树结构。Ant在处理时也遵循此树的路径。在工程级元素(project level,即<project>元素内的XML级),Ant会对XML元素做宽度优先遍历,在目标级元素(即<target>元素内的XML级),Ant要完成深度优先遍历。即,会先加载并处理在<project>元素下一级上的所有元素,然后再移至第一个目标target,从目标target的第一个元素开始,在移至下一个元素之前会尽可能向下(尽可能深)地处理各个元素。
以上的话简单的说,为Ant在进行自身的错误检测或预编译处理时,会先处理全部的工程级元素,然后按运行到的目标target顺序逐一按深度优先的方式进行处理。