一、概述
Ant的构建文件是xml格式的。每个构建文件包含一个project和至少一个(default)target元素。Target包含task元素。每个task元素包含一个id属性,可以通过属性的值来对其进行引用,id属性值必须是唯一的。
二、元素
Project
project有三个属性:
- name:project的名称。
- default:在没有提供target的情况下使用的缺省target。
- basedir:所有路径计算的基本路径。如果设置为相对路径,那么此路径会相对于构建文件所在的目录进行解析。
Description
description标签用于描述project。
Target
每个project定义一个或多个target,每个target就是一组你想要执行的任务。当执行ant时,可以选择你想要执行的target,如果没有指定target,就使用Project中的default值。
target可以依赖于其他的target,ant能够保证其他的target在当前的target之前执行。Ant尝试按照它们在depends中出现的顺序执行(从左到右)。但要注意的是,一个target可能会比depends中它之前的target更早执行。
例如:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假设我们要执行D,根据depends属性,你可能认为执行顺序应该是C、B、A,最后是D。但是实际上由于C依赖于B,B又依赖于A,所以实际的执行顺序是A、B、C、D。在如上D中的依赖链中的target,每个target只执行一次,即使不止一个target依赖于它。
如果target有if或者unless属性,那么这个target也有执行的可能。比如,可以根据系统的状态(java版本、系统、命令行属性等)更好的控制构建过程。
例如:
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
如果module-A-present属性被设置了值,那么第一个target就会执行,而第二个target不会执行。
在if/unless中只允许指定一个属性名,如果想要检查多个条件,可以使用依赖target来计算检查结果。
<project name="myFirstBuildXml">
<target name="mytarget" depends="myTargetCheck" if="cons">
<echo>c1:true and c2:false</echo>
</target>
<target name="myTargetCheck" >
<echo>run myTargetCheck</echo>
<condition property="cons">
<and>
<equals arg1="${c1}" arg2="true"/>
<equals arg1="${c2}" arg2="false"/>
</and>
</condition>
</target>
</project>
if和unless属性只启用或禁用它们所依附的target,它们不能控制这些target所依赖的target是否执行。实际上在target将要执行时它们才会被评估,此时它们依赖的target经执行完了。
可选属性description用来给命令行选项-projecthelp提供此target的简短描述,如果target没有description,则认为它是内部的,除非使用-verbose或-debug选项,否则不会被列出。
将任务tstamp放到所有target都依赖的即所谓的初始化target中是一个很好的做法。确保初始化target在依赖列表的首位。
将任务tstamp放到所有target都依赖的即所谓的初始化target中是一个很好的做法。确保初始化target在依赖列表的首位。
<project name="myFirstBuildXml">
<target name="init">
<tstamp>
<format property="current.year" pattern="yyyy"/>
<format property="DSTAMP" pattern="yyyy-MM-dd"/>
<format property="TSTAMP" pattern="HH:mm:ss"/>
<!-- datetime format that is safe to treat as part of a dotted version -->
<format property="dateversion" pattern="yyyy.MM.dd.HH.mm.ss" />
</tstamp>
</target>
<target name="mytarget" depends="init,myTargetCheck" if="cons">
<description>
this is mytarget description
</description>
</target>
<target name="myTargetCheck" depends="init" >
<echo>run myTargetCheck ${current.year}</echo>
<condition property="cons">
<and>
<equals arg1="${c1}" arg2="true"/>
<equals arg1="${c2}" arg2="false"/>
</and>
</condition>
</target>
</project>
从Ant1.6开始,如果只有几个task,可以将这些task直接放在project元素下。
<project name="myFirstBuildXml">
<tstamp/>
</project>
target的名称可以是XML文件中有效的任何字母数字或这字符,包括空字符串“”,标点符号(如“,”),空格(“ ”)等。要避免使用这些字符,因为这些字符在命令行或IDE中会引起混乱。以连字符开头的target名称是有效的,比如“-restart”,以此来命名不应当直接从命令行中调用的target。
target属性:
- name:target名称。每个target都必须有name,并且是唯一的。
- depends:target依赖的以逗号分隔的target列表。
- if:为了执行target,必须设置的属性的名称。
- unless:为了执行target,必须不能设置的属性的名称。
- description:对target的简短描述。
- extensionOf:将当前target添加到命名的extension-point的依赖列表中(Ant1.8.0+)。
- onMissingExtensionPoint:如果extension-point指定的扩展点不存在,如何处理(fail/warn/ignore,默认fail)?需要与extensionOf联合使用,不能单独使用(Ant1.8.2+)。
Property
property用于在project中设置属性,属性名区分大小写。属性值一旦设置完就不可再改变。
property属性:
- name:属性名。
- value:属性值。
- location:将指定文件的绝对文件名赋值给属性。如果是绝对文件名保持不变,否则,将会解析为相对于project的basedir的绝对路径。
- refid:引用别处定义的对象。只有对路径结构或属性的引用才会生成正确的结果(当使用name时,可以使用value、location、refid或者嵌套文本中的一个)。
- resource:classpath中属性文件格式的资源文件名称。
- file:要加载的属性文件的位置。
- url:包含属性格式文件的url。
- environment:通过设置前缀来访问系统属性(当不使用name时,可以使用resource、file、url、environment中的一个)。
- classpath:查找资源时使用的类路径。
- classpathref:查找资源时使用的类路径的引用。
- prefix:将通过file、resource、url加载的属性的属性名前加上前缀。
- prefixValues:如果属性文件使用属性扩展时,设置为true(目前无论true还是false好像都一样,需要进一步验证)。
- relative:是否使用相对路径,默认为false。与location联合使用,如果为true,属性值将被设置为相对与basedir的相对文件名。
- basedir:用于计算相对路径的basedir,默认为project的basedir。