• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

使用Ant

发布: 2007-5-25 14:31 | 作者: 未知 | 来源: JR | 查看: 76次 | 进入软件测试论坛讨论

领测软件测试网 原文:Ant1.5的手册(manual)

编写一个简单的编译文件(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

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网