Flex Ant自动构建

1.  Flex SDK Ant

Flex开发者会遇到很多,比如自动构建,在一个有着N多模块,N处源码,构建过程复杂的Flex项目开发中,依赖人力手工构建项目非常不现实(机械重复且枯燥无味的过程,相信哪位开发人员都会避之唯恐不及,而且对于人力是非常大的浪费),而通过使用Ant,我们可以将这些工作交给机器来做,机器最适合干的就是这些程序固定,顺次执行的工作,而且不辞辛苦,又快又好。

1.1.     Ant简介

Ant是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make,但没有make的缺陷。目前的最新版本为:Ant 1.8.3。

既然我们已经有了make、gnumake、nmake、jam以及其他的build工具为什么还要要一种新的build工具呢?因为Ant的原作者在多种(硬件)平台上开发软件时,无法忍受这些工具的限制和不便。类似于make的工具本质上是基于shell(语言)的:他们计算依赖关系,然后执行命令(这些命令与你在命令行敲的命令没太大区别)。这就意味着你可以很容易地通过使用OS特有的或编写新的(命令)程序扩展该工具;然而,这也意味着你将自己限制在了特定的OS,或特定的OS类型上,如Unix。

Ant就不同了。与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个特定Task接口的对象来运行。

简言之:当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。

1.2.     Flex支持Ant

打开SDK目录,让我们看看SDK中都包含了哪些内容:

  ant包含Flex对Ant的支持库,JAR和Java源码都有,方便我们基于Ant完成对项目的构建

  asdoc基于ASDOC我们可以很方便的生成代码说明文档,这个目录则包含了对ASDOC的模板支持(调用asdoc的时候,所依赖的HTML模板文件就存放在这个目录),以及一个用于Ant构建的示意XML配置文件,仔细浏览这个目录下的文件,就可以对ASDOC有更好的了解。

  bin按照惯例,我们基本也能猜出这个目录下是什么,没错,就是Flex SDK中包含的工具集(编译工具,库打包工具,文档生成工具,以及优化工具等等,这些可都是Flex开发所必须的利器),这些工具的具体用法,我们会在后面的文章中介绍。建议您将这个路径配置到系统用户的PATH中,方便通过命令行调用相应的工具。

  frameworks这个也是重中之重,包含了Flex框架的核心源码(您应该也已经了解到,Flex是基于AS3的一个框架,其底层代码均是由AS3编写的(注:不包含工具集,工具是Java编写)),当您在Flex编程中有疑惑,看一眼源码或许会让您茅塞顿开。

  include包含了一个用于编写ActionScript扩展的C++头文件:FlashRuntimeExtensions.h,如果您基于AIR做一些嵌入式应用(比如一个电视机),需要实现换台等功能,那就要用C++实现一些ActionScript的扩展。

  install包含了用于移动开发的Android USB驱动程序

  lib开发和编译Flex应用所依赖的类库,打开这个目录您就能发现很多的JAR文件,比如mxmlc.jar,另外您可能已经注意到还有mxmlc_zh_CN.jar,显然这些库大都实现了本地化,方便我们的开发和调试。

  runtimes包含运行时支持,但没有Flash Player,只有AIR,包括AIR for Android的APK文件

  samples一些实例文件,包括用于AIR在线无缝安装的badge,和一些Flex主题。

  templates包含一些模板文件,比如用于AIR应用描述的XML约束定义文档,swfobject的示例代码等等

着重了解一下Flex对Ant的支持情况。打开Flex SDK下的Ant目录,会看到下面的文件结构:

lib中包含了Flex对Ant的任务支持库:flexTasks.jar,src目录中包含了flexTasks的Java源码,build.xml则是用于构建flexTasks本身的配置文件(如果您修改了flexTask的Java源码,可以用这个配置文件,重新编译,并打包到flexTasks.jar)。

2.  环境搭建

需要安装JDK、Ant,并设置环境变量;将flexTasks.jar这个文件放到您的Ant安装目录中的lib目录中,并设置环境变量。

将该压缩包解压到一个目录,然后配置环境变量:

set ANT_HOME=E:\AutoBuild\common\apache-ant-1.8.3

set path=%path%;%ANT_HOME%\bin;

set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_26

set path=%path%;%JAVA_HOME%\bin

set path=%path%; F:\flex_sdk_4.1.0.16076\bin

运行下面命令成功,表示环境已经搭建好了:

3.  自动构建

使用ant自动构建一个项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。

3.1.     build.properties文件

创建build.properties,即Ant的变量配置文件,该文件定义了需要用的配置参数。

3.2.     build.xml文件

Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所依赖的目标。每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。

  核心任务。核心任务是Ant自带的任务。

  可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。

  用户自定义的任务。用户自定义的任务实用户自己开发的任务。

<project>标签

每个构建文件对应一个项目。<project>标签时构建文件的根标签。它可以有多个内在属性,就如代码中所示,其各个属性的含义分别如下。

(1) default表示默认的运行目标,这个属性是必须的。

(2) basedir表示项目的基准目录。

(3) name表示项目名。

(4) description表示项目的描述。

每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。

<target>标签

一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必须先编译该文件,因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。

(1) name表示标明,这个属性是必须的。

(2) depends表示依赖的目标。

(3) if表示仅当属性设置时才执行。

(4) unless表示当属性没有设置时才执行。

(5) description表示项目的描述。

Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执行的顺序是prepare->compile->run。一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总会被执行。

<mkdir>标签

该标签用于创建一个目录,它有一个属性dir用来指定所创建的目录名,其代码如下:<mkdir dir=”${class.root}”/>通过以上代码就创建了一个目录,这个目录已经被前面的property标签所指定。

<delete>标签

该标签用于删除一个文件或一组文件,去属性如下:

(1).file表示要删除的文件。

(2).dir表示要删除的目录。

(3).includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。

(4).failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

(5).verbose表示指定是否列出所删除的文件,默认值为不列出。

<copy>标签

该标签用于文件或文件集的拷贝,其属性如下。

(1).file 表示源文件。

(2).tofile 表示目标文件。

(3).todir 表示目标目录。

(4).overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。

(5).includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。

(6).failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。

(7).verbose 表示制定是否显示详细信息,默认值不显示。

3.3.     实例

这是使用flex ant自动构建项目的一个例子。下面通过这个例子来介绍如何编写字段构建文件build.xml、build.properties。Ant自动化脚本完成了以下工作:

  编译as3项目生成swf

  创建HTML 包装

  创建RSL 动态库(该例子不包含,自行查找资料)

  创建SWC(该例子不包含,自行查找资料)

build.properties文件中定义了以下配置属性

######################################

## project properties

######################################

# 定位到您的项目源码的位置

# {$basedir} 是Ant默认支持的变量

SOURCE_DIR =${basedir}/src

 

# 设定SWF的输出位置

OUTPUT_DIR = ${basedir}/bin

 

######################################

## tools

######################################

# flex sdk安装目录

FLEX_HOME=F:/flex_sdk_4.1.0.16076

# 定位到您的Lib路径,如果存在的话

LIBS_DIR =${basedir}/lib

 

SDK_VERSION = 4.1.0.16076

LOCALE = en_US

build.xml构建文件

<?xml version="1.0"?>

<project name="flex ant autobuild" default="build" basedir="../">

  <!—包含属性定义文件tbuild.properties-->

  <property file="./autobuild/build.properties" />

 

  <!--定义任务的库引用路径,比如下面我们用到了mxmlc,必须让Ant知道去哪里寻找这个任务的定义,包括类名称和classpath。这里我们配置了4个,实际上用到了3个,即调用mxmlc完成编译,调用html-wrapper对SWF进行HTML包裹,调用asdoc生成代码文档。compc是用来编译库(SWC)文件,这里我们没有用到 -->

  <taskdef name="mxmlc" classname="flex.ant.MxmlcTask" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

  <taskdef name="compc" classname="flex.ant.CompcTask" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

  <taskdef name="html-wrapper" classname="flex.ant.HtmlWrapperTask" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

  <taskdef name="asdoc" classname="flex.ant.AsDocTask" classpath="${FLEX_HOME}/ant/lib/flexTasks.jar"/>

 

  <!--完成当前构建任务所需的4个调用,首先是清理,如果bin下面有文件,删除掉;然后是编译,HTML包裹,和ASDoc文档生成。-->

  <target name="build">

    <antcall target="clean"/>

    <antcall target="compile"/>

    <antcall target="wrapper"/>

    <antcall target="asdoc"/>

  </target>

 

  <!--执行清理-->

  <target name="clean">

    <delete includeemptydirs="true">

      <fileset dir="${OUTPUT_DIR}" includes="**/*"/>

    </delete>

  </target>

 

  <!--执行编译,注意debug参数,默认是false,如果您需要开启Debug功能,可以将它设置为true(会增大文件体积)-->

  <target name="compile">

    <mxmlc

            file="${SOURCE_DIR}/Main.as"

            output="${OUTPUT_DIR}/Main.swf"

            locale="${LOCALE}"

            static-rsls="true"

            accessible="true"

            debug="false"

        >

      <!--加载Flex配置文件,如果您有特殊需求(比如要保留自定义的Metadata标签,则可以设置自己定义的Flex配置文件)-->

      <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>

      <!—设置源代码位置-->

      <source-path path-element="${SOURCE_DIR}"/>

 

      <!--下面是对运行时共享库RSL的配置,不是必须,如果您不采用RSL机制,可以删除下面的定义;如果您没用到一些RSL,可以删除-->

      <!--<runtime-shared-library-path path-element="${FLEX_HOME}/frameworks/libs/framework.swc">

        <url

rsl-url="http://fpdownload.adobe.com/pub/swz/flex/${SDK_VERSION}/framework_${SDK_VERSION}.swz"

policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>

        <url rsl-url="framework_${SDK_VERSION}.swz" policy-file-url=""/>

      </runtime-shared-library-path>-->

 

      <!--因为Flash Player内置的库,不需要打包到SWF,所以对playerglobal采取了排除方式-->

      <!--<external-library-path file="${FLEX_HOME}/frameworks/libs/player/10.1/playerglobal.swc" append="true"/>

      <library-path file="${FLEX_HOME}/frameworks/libs/flash-integration.swc" append="true"/>

      <library-path file="${FLEX_HOME}/frameworks/libs/authoringsupport.swc" append="true"/>-->

 

      <!--引用本地化的库支持-->

      <library-path dir="${FLEX_HOME}/frameworks/locale/${LOCALE}" includes="*" append="true"/>

      <!--当前项目的库引用位置-->

      <library-path dir="${LIBS_DIR}" includes="*" append="true"/>

    </mxmlc>

 

    <!--如果基于RSL,为了保证用户在第一次使用RSL的时候,且链接不到Adobe服务器的情况下,保证应用可以正常运行,需要将这些Adobe签名的RSL移动到项目的部署目录下面。具体说明请参阅RSL的相关文章。-->

    <!--<copy file="${FLEX_HOME}/frameworks/rsls/spark_${SDK_VERSION}.swz" tofile="${OUTPUT_DIR}/spark_${SDK_VERSION}.swz"/>

    <copy file="${FLEX_HOME}/frameworks/rsls/charts_${SDK_VERSION}.swz" tofile="${OUTPUT_DIR}/charts_${SDK_VERSION}.swz"/>

    <copy
file="${FLEX_HOME}/frameworks/rsls/sparkskins_${SDK_VERSION}.swz"
tofile="${OUTPUT_DIR}/sparkskins_${SDK_VERSION}.swz"/>

    <copy
file="${FLEX_HOME}/frameworks/rsls/framework_${SDK_VERSION}.swz"
tofile="${OUTPUT_DIR}/framework_${SDK_VERSION}.swz"/>

    <copy file="${FLEX_HOME}/frameworks/rsls/mx_${SDK_VERSION}.swz" tofile="${OUTPUT_DIR}/mx_${SDK_VERSION}.swz"/>

    <copy file="${FLEX_HOME}/frameworks/rsls/textLayout_2.0.0.232.swz" tofile="${OUTPUT_DIR}/textLayout_2.0.0.232.swz"/>

    <copy
file="${FLEX_HOME}/frameworks/rsls/spark_dmv_${SDK_VERSION}.swz"
tofile="${OUTPUT_DIR}/spark_dmv_${SDK_VERSION}.swz"/>

    <copy
file="${FLEX_HOME}/frameworks/rsls/advancedgrids_${SDK_VERSION}.swz"
tofile="${OUTPUT_DIR}/advancedgrids_${SDK_VERSION}.swz"/>

    <copy file="${FLEX_HOME}/frameworks/rsls/rpc_${SDK_VERSION}.swz" tofile="${OUTPUT_DIR}/rpc_${SDK_VERSION}.swz"/>-->

  </target>

 

  <!--执行对SWF进行HTML包裹,可以传递一些参数-->

  <target name="wrapper">

    <html-wrapper

            output="${OUTPUT_DIR}"

            file="Main.html"

            swf="Main"

            history="true"

            express-install="true"

            version-detection="true"

            version-major="10"

            version-minor="2"

            version-revision="0"

            height="100%"

            width="100%"

            title="Main"

            bgcolor="white"

        />

  </target>

 

  <!--执行ASDoc文档生成-->

  <target name="asdoc">

    <asdoc output="${OUTPUT_DIR}/asdoc" lenient="true" failonerror="false">

      <doc-sources path-element="${SOURCE_DIR}"/>

      <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>

      <library-path dir="${LIBS_DIR}" includes="*" append="true"/>

    </asdoc>

  </target>

 

</project>

 

运行ant会自动生成swf文件和相应的ASDoc文档:

 

时间: 2024-10-31 07:13:41

Flex Ant自动构建的相关文章

使用 Flex Ant Tasks 构建 Flex 项目(那位大虾看一下这个问题怎么解决啊,感谢)

问题描述 build.xml配置文件如下:<projectname="SCMAXAntTaskproject"basedir="."><taskdefresource="flexTasks.tasks"classpath="${basedir}/libs/flexTasks.jar"/><propertyname="FLEX_HOME"value="D:Program

在Eclipse中使用ANT灵活构建Web应用

前言 ant是java开发者工具箱的重要一环,junit,xdoclet等都与它紧密关联,程序员可能习惯了IDE提供的自动构建,甚至部署的功能,从而忽略了ant本身,其实,主流的IDE通常是内置ant任务来完成这些工作的,熟悉ant内在的机理,可以阅读或简单修改build.xml无疑可以帮助你更灵活地集成.管理应用项目,如果需要学习maven这种开源项目管理解决方案,也是要以理解ant为基础的哟.另外,使用ant的过程实际上对构建进行了文档化,它是无关于IDE的,想象一下,你的同事中可能三分之一

WebSphere Commere增量代码的自动构建与部署框架介绍

其中包括涉及的概念,使用的工具,框架结构和环境的准备.通过阅读本文,读者能够对如何实现自动化代码构建和部署有一个基本的了解. Agile -敏捷开发.近些年开始被人们广泛关注.它提倡将一个完整的软件版本划分为多个迭代周期.每个迭代实现不同的特性.重大的,优先级高的特性优先实现,风险高的特性优先实现.在项目的早期就将软件的原型开发出来,并基于这个原型在后续的迭代中不断完善. Delta Code -增量代码.在 Agile 开发模式中,开发人员基于软件原型不断的编写代码对其进行完善和扩充.这些代码

在Hudson中,使用ant自动对安卓项目编译打包apk

      本文对如何在hudson中配置ant编译打包apk进行说明,主要包括build.xml文件的编写.环境的配置.在Hudson中创建任务. 一.为安卓项目创建build.xml文件 1.打开cmd进入sdk目录下的tools目录,输入: android.bat list target  来查询我们现有的版本list有哪些.如下图: 途中用红框圈出的 id 与蓝框圈出的版本号对应关系,下面需要用到. 2.打开安卓项目工程下的 project.properties 文件,查看target

如何使用ANT自动进行数据库的相关操作

如何使用ANT自动进行数据库的相关操作  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 赵才文(vipcowrie@sina.com)版权所有            如今的系统,无论是基于CS的还是基于BS的架构,如果与数据库打交道,那么程序员在开发系统的时候,或者在进行单元测试的时候,经常要对数据库进行一些重复的操作,例如初始化,建库,删除表格,插入测试数据等等.每

openmeetings源码编译-不知道有没有大神研究openmeetings,使用的是3.0.3版本,使用ant+ivy构建依赖和项目的

问题描述 不知道有没有大神研究openmeetings,使用的是3.0.3版本,使用ant+ivy构建依赖和项目的 ant运行build.xml过程中老出错 <untar src="${red5.server.dir}/target/red5-server-${red5.server.version}-server.tar.gz" dest="${red5.server.dir}/target" compression="gzip"/>

android-Android ant自动集成打包出错

问题描述 Android ant自动集成打包出错 F:adt-bundle-windows-x86-20140321sdktoolsantbuild.xml:653: The following error occurred while executing this line: F:adt-bundle-windows-x86-20140321sdktoolsantbuild.xml:698: null returned: 1 解决方案 如果我们的build.xml版本一致的话. 我看到的是 6

exception-Android之ndk开发,使用ant自动创建头文件 出错

问题描述 Android之ndk开发,使用ant自动创建头文件 出错 这是ant源码 <?xml version="1.0" encoding="UTF-8"?> description <!-- ================================= target: BuildAllHeaders ================================= --> <target name="BuildA

C++编程规范之2:使用自动构建系统

使用自动构建系统 原则:     一次按键就解决问题,使用完全自动化("单操作")的构建系统,无需拥护干预即可构建整个项目. 讨论:     构建有2种模式:增量构建和完全构建.增量构建只重新构建上次构建(可以是增量的或者是完全的)以来发生变化的部分.注意:两次连续增量构建中的第二次构建不应该编写任何输出文件:否则坑内会出现依赖循环,构建系统也可能会执行不必要的操作.     一个项目的完全构建可能有不同形式.可以考虑通过改变许多基本特性,调整构建过程的参数,候选的特性包括目标架构,调