Wednesday, July 09, 2008

什么是好的构建工具?

从我开始接触到linux的时候,我就知道一个叫做makefile的东西,不过从来不敢改,不敢动,因为对linux不熟悉,对c语言不熟悉。后来据说因为makefile对平台依赖性太强,又除了一个autoconfig,那些都是linux+c的东西。
再到后来就是ant了,很多项目中也都采用了ant,非常灵活,可以说只有想不到没有做不到。但是也的确存在一个问题,在大型项目中,维护ant的构建脚本本身也会变成一个沉重的负担,需要有专门的人来负责。我曾经在一个erp公司做过,其中包含很多子项目,ant脚本到处都是,而且彼此引用,光是看那些脚本,就看到的我目瞪口呆:ant这么强大,ant这么复杂。
没有在具体的项目中应用过maven,只是想要看看为什么有了ant,人们还需要maven。 ant和maven在某种意义上是两个完全相反的东西,你可以随心所以的使用ant,编写各种插件,脚本,让它来适应你的习惯,你的哲学,但是maven,如果你想要舒服的使用maven,最好就是适应它的哲学,适应它的习惯,不然,可能不是那么好驾驭。 maven一个很重要的哲学就是‘惯例比配置更重要’,我很赞同,使用惯例我们可以减少大量的配置文件,也就减少大量的脚本,减少维护的工作。 此外,maven标准化了项目的构建工作,的确,几乎所有的项目都包含这样一个构建流程:编译,测试,打包,部署。 在ant中,每个项目都需要从头开始(其实不一定,我在使用ant的时候就借鉴了interface的思想,定义了一些标准的target,保证所有的项目这些都有同样的ant target,完成同样的任务,虽然实现可以不一样。。。。毕竟,这不是工具本身支持的,需要人们手工来做,需要相关人员的理解,共识)。
对maven还不是太熟悉,但是觉得不如ant那么容易上手,pom的结构太复杂,也有可能导致一大堆xml配置文件。 maven有一个完美的思想和比较蹩脚的实现,maven1出来的时候大受好评,但是等到maven2,人们开始越来越多的抱怨它。 mavne的依赖管理是先对于ant最出色的特性(现在ant可以和ivy接合来实现包的依赖管理),但是现在看来人们正是对这块不满意,不是说包依赖管理不好,而是这个功能实现的不好,经常会导致构建的失败。人们可能莫名其妙的发现,上一次好好好的成功的构建,在没有人们变动的情况下,怎么现在就构建失败了,其实很可能是包仓库中某个依赖变化了,而修正这个问题据说是一场噩梦。
maven是比ant更高级的构建工具,虽然有那么多问题,但是目前来看,maven还是首选,至少最流行的spring项目就是采用maven构建的。
此外,有一个ruby开发的java项目构建工具,名字叫buildr,也成为了apache的incubutor项目,但是对于很多java开发人员来讲,部署一个ruby应用可能不是那么简单,其他远不如copy一份ant或者maven那么简单。

No comments: