详见我的博客:http://www.zawaliang.com/2013/04/319.html
在团队里,一个项目通常对应多个开发人员,基于对性能优化的考虑,上线前往往需要对js、css等资源进行压缩、合并、修改时间戳,然后再按团队规范提交SVN,最后由SVN导出增量zip发布包进行发布。
传统的做法可能需要手工对一个个修改过的文件进行YUI压缩,然后更新相应的时间戳,最后根据SVN log提取文件打包。
既然工作流程都是基本固化的,作为懒人,就需要省时省力点的做法。
Apache Ant,一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具。没有了解过的同学自己Google学习,下面我就以一个Demo为例,给大家介绍下Ant的大部分常用功能,并达到自动压缩、合并、SVN提交、生成增量zip包的目的。
Demo
假设我们的目录架构如下,html5为根目录,app里放了一个lottery的应用,app.json.tpl为统一的版本号文件,build.xml为Ant的入口文件;res为资源目录,里面也放了lottery的资源文件。
我们现在需要把每个xx.js压缩为xx.min.js,xx.css压缩为xx_min.css,并将更改版本号应用到app.json文件里。
html5/--- |---app/ |---lottery/ |---a/ |---a.html |---b/ |---b.html |---index.html |---app.json |---app.json.tpl |---build.xml |---res/ |---app/ |---lottery/ |---css/ |---global/ |---global.css |---index/ |---index.css |---js/ |---common/ |---zepto.js |---touch.js |---app.js |---index/ |---index.js
第三方库
因需要用到SVN、xpath、for循环等功能,需要引入第三方库,点击这里下载并解压到Ant的lib目录即可。
Ant-Contrib Tasks
svnant
svnant不支持svn1.7.x版本,这里使用svnkit1.7的版本
其他支持svn1.7.x的方案,未验证
- svnant不支持SVN1.7.X版本,所以这里使用优化过的svntask
- https://github.com/opticyclic/svntask
- svntask (功能比svnant少,但支持svn1.7.x)
- http://code.google.com/p/svntask/
build.xml
详细请参考:https://github.com/zawaliang/AntSvnDemo
下面说明一些需要注意的点:
- project的basedir需要定位到根目录,这也是取SVN基准地址的前提
<project name="lottery" default="build" basedir="../../" xmlns:ac="antlib:net.sf.antcontrib"> - 基于SVN Commit Message进行提取需要根据指定的规则进行,这里以“[xxx_v1.0] abcde”的格式提取,最后生成的zip包命名为“xxx_v1.0.zip”
<property name="svn.version-regexp" value=".*(\[(.+)\]).*" /> - app.json.tpl为版本号文件,这里需要替换的token格式为:{/html5/res/app/lottery/js/common/zepto.min.js},其中的地址为文件相对根目录的地址,这个token最终会被替换为文件校验和(MD5值)
- SVN日志数限制是一个经验值,由于不能指定某个revision区间,这里取的是所有日志,但限定提取的条数,这个请根据实际项目的经验值调整。
<property name="svn.log-limit" value="100" />
- 文件压缩
<apply executable="java" verbose="true" dest="${path.build.js}" failonerror="true" parallel="false"> <fileset dir="${path.build.js}" includes="**/*.js" excludes="**/*${suffix.js}" /> <arg line="-jar" /> <arg path="${path.yuicompressor}" /> <arg line="--charset ${encode.js}" /> <arg value="--type" /> <arg value="js" /> <arg value="-o" /> <targetfile /> <mapper type="regexp" from="^(.*)\.js$" to="\1${suffix.js}"/> </apply>
- 文件合并
<concat encoding="${encode.js}" outputencoding="${encode.js}" destfile="${path.build.js}/common/lottery${suffix.js}"> <header trimleading="yes">${copyright.zepto}</header> <path path="${path.build.js}/common/zepto${suffix.js}" /> <path path="${path.build.js}/common/touch${suffix.js}" /> <path path="${path.build.js}/common/app${suffix.js}" /> </concat>
- SVN初始化,由于写作时svnant官方还不支持svn1.7.x的版本,所以这里需要更新svnkit到1.7.9的版本方可
<target name="svn-init"> <echo level="info" message="正在初始化SVN..." /> <path id="path.svnant"> <pathelement location="${ant.library.dir}/svnant/svnant.jar" /> <pathelement location="${ant.library.dir}/svnant/svnClientAdapter.jar" /> <pathelement location="${ant.library.dir}/svnant/ganymed.jar" /> <!-- svnkit-1.7.9 支持svn1.7.x --> <pathelement location="${ant.library.dir}/svnkit-1.7.9/svnkit-1.7.9.jar" /> <pathelement location="${ant.library.dir}/svnkit-1.7.9/svnkit-javahl16-1.7.9.jar" /> <pathelement location="${ant.library.dir}/svnkit-1.7.9/sqljet-1.1.7.jar" /> <pathelement location="${ant.library.dir}/svnkit-1.7.9/antlr-runtime-3.4.jar" /> <pathelement location="${ant.library.dir}/svnkit-1.7.9/sequence-library-1.0.2.jar" /> </path> <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="path.svnant" /> <svnSetting id="svn.settings" svnkit="true" javahl="false" username="${svn.user}" password="${svn.password}" failonerror="true" /> </target>
- 关于SVN基准路径的获取,基于svn内部变量来自动获取当前工作副本的svn映射路径
<ac:propertyregex property="repourl" override="true" casesensitive="true" global="true" input="${svn.info.repourl}" regexp="\\" replace="\\\\\\\\" defaultValue="${svn.info.repourl}" /> <ac:propertyregex property="repourl" override="true" casesensitive="true" global="true" input="${repourl}" regexp="\:" replace="\\\\:" defaultValue="${repourl}" /> <ac:propertyregex property="repourl" override="true" casesensitive="true" global="true" input="${repourl}" regexp="\." replace="\\\\." defaultValue="${repourl}" /> <ac:propertyregex property="svn.basedir" override="true" casesensitive="true" global="true" input="${svn.info.url}" regexp="${repourl}(.*)" select="\1" />
- 提交新增的文件到SVN时注意不要使用fileset,否则会出现告警
<!-- 使用fileset会导致失败 http://stackoverflow.com/questions/11402891/svn-ant-add-task-with-force-option-gives-is-already-under-version-control --> <add force="true" dir="${path.js}" /> <add force="true" dir="${path.css}" /> <add force="true" dir="${path.app}" />
- SVN日志解析,文件路径提取及zip包处理
<!-- 1. 查询commit message含指定版本号的节点 --> <!-- 2. 排除Action=Deleted的目录或文件 --> <copy property="log.paths" path="/log/logentry[contains(msg, '${svn.versionFormat}')]/paths/path[@action!='D']/text()" append="true" trim="true" propertySeparator="|" />
先提取含指定版本号的节点,同时排除action为deleted的操作。在处理zip包时,对svnlog获取到的路径再加以判断,以排除那些delete操作的文件(夹)。
<ac:var name="zip.isfile" unset="true" /> <available file="${zip.file}" type="file" property="zip.isfile" /> <ac:if> <isset property="zip.isfile" /> <ac:then> <ac:if> <!-- ant build.xml不处理 --> <equals arg1="${zip.file}" arg2="${ant.file}" /> <ac:else> <echo level="info" message="File: ${zip.file}" /> <copy file="${zip.file}" tofile="${zip.tofile}" overwrite="true" preservelastmodified="true" /> </ac:else> </ac:if> </ac:then> <ac:else> <!-- 不存在,有可能是svn deleted的目录或文件 --> <ac:var name="zip.isdir" unset="true" /> <available file="${zip.file}" type="dir" property="zip.isdir" /> <ac:if> <isset property="zip.isdir" /> <ac:then> <!-- 空目录处理 --> <echo level="info" message="Dir: ${zip.file}" /> <mkdir dir="${zip.tofile}" /> </ac:then> <ac:else> <!-- 表明当前路径为svn deleted的文件或目录,不需要处理 --> </ac:else> </ac:if> </ac:else> </ac:if>
完整版请参考:https://github.com/zawaliang/AntSvnDemo
相关推荐
在IT行业中,构建自动化工具是项目管理的重要环节,Apache Ant是一个广泛应用的Java构建工具,它允许开发者通过XML配置文件来定义构建任务。本主题聚焦于如何利用Ant与XMLTask jar包来获取SVN(Subversion)版本信息...
标签“源码”和“工具”暗示了内容可能涉及源代码管理和利用Ant工具进行自动化构建。Ant可以与各种工具集成,包括SVN,以便在构建过程中自动处理版本控制操作。这通常包括从SVN仓库检出最新代码,或者在代码修改后将...
Ant是一种由Apache软件基金会开发的Java构建工具,它允许开发者通过XML文件定义任务来自动化构建、测试和部署Java应用程序。而SVN(Subversion)则是一种版本控制系统,用于管理项目的源代码版本,便于团队协作和...
最后,Jenkins是持续集成和持续交付工具,它可以自动化构建、测试和部署过程,使得接口自动化测试更加高效和可靠。 4. **Jenkins集成**: - **安装Jenkins插件**:如JMeter Plugin,用于解析JMeter测试结果并展示...
Apache Ant 是一个由Java语言编写的构建工具,它在软件开发过程中主要负责自动化构建任务,如编译、打包、测试和部署。Ant以其灵活性和可扩展性而闻名,它的核心概念是基于XML的构建文件(build.xml),在这个文件中...
在Java开发过程中,Ant广泛用于自动化构建流程,尤其是在没有使用集成开发环境(IDE)时。在给定的场景中,"ant 脚本从svn上取代码打包代码全,同时包括相关的jar包",这意味着我们需要了解如何用Ant配合Subversion...
标题中的“ant+svn”指的是在软件开发过程中使用Apache Ant工具和Subversion(SVN)版本控制系统进行构建和版本管理的组合。Ant是Java平台上的一种开源构建工具,它使用XML来描述构建过程,使得构建脚本易于理解和...
总之,这个项目利用Ant作为自动化构建工具,结合Subversion进行源代码版本控制,通过一系列配置和脚本实现了从获取源码到打包成可部署格式的完整流程。这对于团队协作和持续集成/持续部署(CI/CD)是非常关键的。
描述中提到的链接指向了一篇ITEYE博客文章,虽然具体内容未给出,但可以推测这篇博客可能详细介绍了如何使用ANT进行自动化构建,包括如何编写`build.xml`文件,配置各种任务,以及如何执行构建过程。通常,这样的...
Ant是一种流行的Java构建工具,它使用XML格式的构建文件(build.xml)来定义一系列的任务,如编译、打包、测试等,以自动化软件开发过程。Ant的主要优点是它的灵活性和可扩展性,可以根据项目的特定需求定制构建流程...
Apache Ant 1.8.2 是一个广泛应用的Java构建工具,它使得开发者能够通过XML配置文件来自动化构建、测试和部署Java项目。Ant是Apache软件基金会的一个项目,它以其灵活性和可扩展性著称,可以处理各种构建任务,包括...
14. **持续集成**:Ant可以与其他持续集成工具如Jenkins、Travis CI等结合,实现自动化构建和测试流程。 总的来说,Apache Ant 1.9.4是Java项目构建的强大工具,尤其在Linux环境中,它提供了丰富的任务和高度可定制...
总结来说,Apache Ant是一款强大的自动化构建工具,尤其适合Java项目。它通过XML配置文件定义构建流程,具有高度的灵活性和可扩展性,可在Windows和Linux环境下运行,为开发者提供了一套全面的项目构建解决方案。在...
标题 "Hudson+Ant+SVN+Tomcat实现快速构建(一)" 涉及的是在软件开发中使用一系列工具进行自动化构建的过程。这个过程是持续集成的一部分,旨在提高开发效率,确保代码质量,并减少错误。以下是这些工具在构建流程...
总结来说,SVN+ant的组合提供了一种强大的代码管理和自动化构建解决方案。SVN帮助团队协作并追踪代码变更,而Ant则通过XML脚本实现了编译、打包等任务的自动化。通过合理配置build.xml和build.properties,你可以...
【CruiseControl + ANT + SVN】是一个集成开发环境(IDE)自动化构建和版本控制的解决方案。这个组合在软件开发过程中发挥着关键作用,确保代码的持续集成和版本管理。下面将详细阐述这三个组件以及它们如何协同工作...
- **自动化构建**:利用Ant自动构建工具可以实现构建流程的自动化,提高开发效率。 - **分支命名规范**:为了方便管理和识别,建议使用统一的命名规范来命名分支和标记。 - **文档记录**:记录每次合并的原因和结果...
Ant以其灵活性和可扩展性而闻名,是Java项目管理和自动化构建的重要选择。 在Java开发环境中,Ant主要扮演着以下几个关键角色: 1. **构建脚本**:Ant使用XML格式的build.xml文件作为构建脚本,其中包含了构建过程...
Ant是一个基于XML的构建工具,用于自动化Java项目构建、编译、测试和部署等任务。而SVN则是一个版本控制系统,用于管理软件项目的源代码版本,使得开发者可以协同工作并追踪代码更改历史。当使用Ant进行构建时,有时...