一个Target是一系列的Task的容器,这相当于
一个Target可以依赖其他的Target,Ant会保证那些被依赖的Target会在当前的target之前被执行。例如我们有一个Target用来编译,另一个待分配的Target用来做其他的事情,这个待分配的Target就依赖于那个负责编译的Target,Ant会自动的解决这些依赖关系。
我们需要注意的是,Ant在执行depends中的Target的时候是按照从左到右的依赖关系来执行的,一定要记住。比如我们现在有如下的Target:
<?xml version="1.0" encoding="UTF-8"?>
<project default="D" basedir="D:\AndroidWorkplace" name="第一个Project">
<target name="main"><echo>mian Target编译</echo></target>
<target name="A"><echo>Target:A is compiling...</echo></target>
<target name="B" depends="A"><echo>Target:B is compiling...</echo></target>
<target name="C" depends="B"><echo>Target:C is compiling...</echo></target>
<target name="D" depends="C,B,A"><echo>Target:D is compiling...</echo></target>
</project>
假设我们执行
D
目标,看他的
depends
属性你也许会以为首先执行
C
然后是
B
,最后是
A
被执行,错!
C
依赖于
B
,
B
依赖于
A
,所以
A
是最先执行的然后是
B
最后是
C
!所以正确的执行顺序是这样的:
A--->B--->C--->D
如下便是执行的结果:
在这种依赖链中,比如D及其之上所有的Target,每一个Target都只被执行了一次,尽管有多个Target依赖他(比如:A是最底层的,那么B、C、D都依赖于A的执行)。因此,当执行目标D时,首先会导致C被执行,然后就会导致B,然后导致A被执行,在A、B和C都执行完毕后,就返回到D的依赖列表,但是不会调用B和A,因为他们已经在C和D的依赖中被调用过了。
此外,Target还可以检测是否设置了Property值,这个可能不太好理解,我们举个例子吧,假设我们现在有一个build文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project default="AModule" basedir="D:\AndroidWorkplace" name="第一个Project">
<property name="module-A-present" value="Aaa"></property>
<target name="AModule" if="module-A-present"><echo>Target:AModule is compiling...</echo></target>
</project>
此时控制台会打印Target:AModule is compiling...但是如果去掉上面的<property>设置,那么此AModule目标就不会执行。
而如果我们此时将if换成unless那么目标就不会执行,反之,如果去掉<propperty>就可以执行,没错,这就是if和unless的用法。
需要注意的是每一个Target的if/unless只能指定一个条件检测,如果想要检查多个Property就可以这么来:
<?xml version="1.0" encoding="UTF-8"?>
<project default="myTarget" basedir="D:\AndroidWorkplace" name="第一个Project">
<property name="myTarget.run" value="Aaa"></property>
<target name="myTarget" depends="myTarget.check" if="myTarget.run">
<echo>Files foo.txt and bar.txt are present.</echo>
</target>
<target name="myTarget.check">
<!-- 使用多个condition -->
<condition property="myTarget.run">
<and>
<available file="foo.txt"/>
<available file="bar.txt"/>
</and>
</condition>
<condition property="myTarget.runs">
<and>
<available file="foo.txt"/>
<available file="bar.txt"/>
</and>
</condition>
</target>
</project>
执行以上build的时候会打印出myTarget的信息,但是如果将其if值改为myTarget.runs就不会打印信息,即他不会被执行,因为在myTarget.check中的名为myTarget.runs的condition并没有在Property中声明。