俗话说,遍身罗绮者,不是养蚕人。我们为别人写程序,缺陷有时间让我们自己的工序自动化。如果可以让计算机承担更多的更复杂的周期任务,我们将会有更多的时间做更有价值的工作。自动化可使用shell脚本,构建文件,配置和自动构建工具,并不在于多么深入学习这些,而是要综合考虑学习成本和自动化之后效率的提升。一般来说,现在花功夫学习这些自动化工具,对此后的开发是有很大好处的。
这一系列的总结文章,是程序员修炼三部曲的项目自动化之道的学习笔记。按照目录,大体上分为单步构建、定时构建、按键发布、安装与部署、监控五个步骤(方面)来记录。本系列拟以一个简单的数据库读写程序为例说明自动化全过程。本文对序言和单步构建部分进行总结。
序言中的例子,生动而全面地说明了项目自动化的应用场景,已经应用之后的效用。总结出来项目自动化的三种类型是为:命令自动化(例如javac编译的自动化),定时自动化(定是编译和构建)和触发自动化(错误触发信息发送)。我们可能需要知道这些知识才能进行项目自动化:版本控制,自动化测试,脚本编写,通信工具。一般而言所有你手工执行了两遍以上的任务都可以被自动化。
单步构建:所谓单步构建就是采用脚本来执行所有需要手动执行的步骤。类似与学习菜谱的步骤来做菜。原则为:CRISP,即:complete,repeatable(版本控制来保证),informative,scheduable(后台执行),portable(不依赖特定IDE、机器IP、目录)五个属性。注意这里的构建不同于IDE里的编译,因为团队中的IDE配置不尽相同,没有办法保证编译和构建的一致性。
对于一个项目来说,版本控制部分包括这个项目的源码,测试代码与第三方库。当然构建脚本也应该置于版本控制之下。我们模拟一个小项目userview来说明项目自动化。Userview读取一个仅有三列数据的数据表显示在console上。
首先建立项目目录d:\www.gongqingkui.cn\userview\,目录结果在Eclipse下如图所示:
生成的代码和测试代码都输出到build文件夹下,代码生成到prod目录下,测试生成到test目录下。下面我们开始手动构建过程。首先构建build文件夹。Cmd下执行mkdir build命令新建文件夹。使用javac编译命令遍以上述代码:javac -dbuild/prod src/userview/*.java将src/userview/下代码全部编译到build/prod下。javac-classpathvendor/lib/junit.jar;vendor/lib/sqljdbc4.jar;vendor/lib/mysql-connector-java-5.1.7-bin.jar-d build/test test/userview/*.java编译test/userview/下代码到build/test下,注意这里附加了Junit、sqlserver和mysql的jar包。
下面使用Ant脚本自动化上述构建过程:新建build.xml文件,输入脚本代码:
<?xml version="1.0" encoding="UTF-8"?> <project name="userview" default="compile"basedir="."> <propertyname="build.dir" value="build"></property> <propertyname="build.prod.dir"value="${build.dir}/prod"></property> <propertyname="build.test.dir"value="${build.dir}/test"></property> <propertyname="doc.dir" value="doc"></property> <propertyname="index.dir" value="index"></property> <propertyname="src.dir" value="src"></property> <propertyname="test.dir" value="test"></property> <propertyname="vendor.lib.dir"value="vendor/lib"></property> <pathid="project.classpath"> <pathelementlocation="${build.prod.dir}"/> <pathelementlocation="${build.test.dir}"/> <filesetdir="${vendor.lib.dir}"> <includename="**/*.jar" /> </fileset> </path> <targetname="perpare"> <mkdirdir="${build.prod.dir}"/> <mkdirdir="${build.test.dir}"/> </target> <targetname="compile" depends="perpare"> <javacdestdir="${build.prod.dir}" srcdir="${src.dir}"> <classpathrefid="project.classpath"/> </javac> </target> </project>
上述代码定义了首先定义项目属性,再定义一些必须的属性,指向项目的类和代码及生成目录,然后执行编译命令,编译源代码。在项目目录下执行ant命令,可见ant进行自动编译的过程和结果:
D:\www.gongqingkui.cn\userview>ant Buildfile: D:\www.gongqingkui.cn\userview\build.xml perpare: compile: BUILD SUCCESSFUL Total time: 0 seconds 下面我们编译测试代码,并运行测试,其结果为: D:\www.gongqingkui.cn\userview>ant test Buildfile: D:\www.gongqingkui.cn\userview\build.xml perpare: compile: compile-test: test: [junit] Testsuite:userview.DBTest [junit] Tests run: 2,Failures: 0, Errors: 0, Time elapsed: 0.01 sec [junit] BUILD SUCCESSFUL Total time: 1 second
通过Ant脚本的持续构建,可以发现以往不可能发现的累积错误。
Ant的替代产品是maven,更高层次地封装了类似于Ant的操作。Groovy脚本用于从java代码中调用Ant脚本任务。可以书写更复杂的构建任务,但是当前ant脚本功能和插件已经相当完备,在自动化系列中,ant已经可以完成所有任务。
总结:我们从建立项目目录开始,手动键入javac编译命令,使用ant脚本自动化javac和目录的所有操作,同时编译和自动构建junit测试。下一篇文章将会描述定是构建的方法。
参考
1. 使用Ant和批处理备份数据
2. JUnit下的测试和suite
3. Ant结构化程序设计和WEB程序发布
4. Ant的主要任务的语法
5. Ant脚本的详细配置
6. Subversion综述