1 序言
Gradle现在基本已经是jvm构建世界里的头一把交椅了, 像Spring,Android都是首推gradle编译的。同时,gradle也和它的前辈们一样,跨越了更多的语言的边界,成为了一个通用的构建工具。 这篇文章主要通过侃大山的方式,聊一聊Gradle的前辈ant和maven,对比前辈和gradle的区别,gradle为何更加优秀。同时也会谈到远古的make, 还有js世界的webpack,做一个横向的对比。
2 Gradle 的出生
Gradle的第一个Release是在2007年。创始人Hans Dockter, 在聊到他创建gradle的目标,是创建一个高效地,自动化地,适合大型企业的构建工具【1】。 他设定了一个非常高的目标,将不可能的事情,变成可能。有很多pain point,Hans提出很多pain point,并且表示Gradle的目标就是解决这些问题。 更近一步,gradle是有一个企业在背后提供服务的,这意味着,作为一个开源项目,这个项目可以得到更高的更加积极的维护,这是一个非常聪明的做法。Community和公司双核驱动,能够更加积极地推进项目的进展。
在进一步介绍 gradle 解决的pain point之前,先请出几位前辈的介绍
3 远古的 Make
Make不算是最早的有依赖管理的自动化构建工具,但是一定是早期传播最广的构建工具。依附着Unix的传播,让make在一段时间成为构建工具的代名词。Make的构建非常方便,非常自由,就像写shell脚本一样。
4 中古的 Ant
Ant是早期被广泛使用的java项目构建工具,第一个release是在2000年【2】, 脱胎于tomcat项目。 Ant的主要目标是替代早期Unix系统中的Make工具。 Make在一段时间内是Java的构建解决方案,Just like C++。 但是时代在发展, 更多地语言出现了,更多地操作系统出现了, 更多的平台出现了。JVM作为一个跨平台的解决方案,一个跨平台的构建解决方案也是势在必行。 Ant在这个时机,作为一个Make的jvm版本继任者,华丽地登场了。make 使用自己的makefile,并且自定义的DSL来处理依赖关系。makefile非常灵活,但是也带来了unix风格的阅读障碍(站在历史发展的角度看,只是语法过时了而已)。为了解决这个问题,Ant使用了当时非常火的XML来描述makefile, build.xml。 个人的看法,ant很好地翻译了makefile,但是没有在构建工具理念的本身上,往前推进。
5 近代的maven
随着Java项目越来越庞杂,开源框架不断增加,如何管理一个大型项目变成了一个技术活。 Java有自己的包管理方案,但是代码框架总是在不断演进,并且在越来越复杂。 对于个人开发者来说,为了完成一个tiny project,需要理解数个大型项目的构建,同时进行版本管理,这根本说不过去。
Ant还有一个问题,就是太灵活了。 它和Make一样,能够让用户办到几乎所有的事情。但是,过于灵活的代价,就是在很多方面,过于简单。比如如何进行版本管理,构建时候的缓存应该如何处理等等。
Maven 1, 在2004年发布,目标就是更好地,更加有章法地来管理项目。解决痛点,是标准化构建的架构。Ant在maven出现后,使用Ivy来进行版本管理,一度搬回一城。不过,很快,在2005年,maven完成了类似lvy的功能来管理不同模块的不同版本。
Maven也是使用xml来描述构建
6 DSL Groovy的诞生
Groovy的第一个版本诞生于2007年(从2003开始提出)。并且诞生了使用groovy来解决xml阅读困难的ant插件,Gant。Groovy是一门动态语言, 抛弃了繁琐的类声明和类型声明,是一门可以解放java程序员的DSL。 Gant把创建构建步骤变成了定义一个构建函数,这是语义进步的一小步,但是是构建工具的一大步。
7 现代的 Gradle
介绍完上面的工具之后,回到Gradle的出现。 创始人Hans,有一个非常大胆的想法,把所有构建工具的优点都集合起来。 解决掉它们的问题,做一个超级超级强大的构建工具
Gradle的特点
- gradle is groovy
- flexible conventions
- Robust and powerful dependency panagment
- Scalable builds
- Effortless extendibility
- Community-driven and company-backed
- Integration with other build tools
- Expressive build langage and deep API
Gradle的优点
- build.gradle 文件远小于Ant和maven的构建文件
- Gradle 比 maven 更加包容 ( 更方便地自定义打包流程,和项目结构 )
- Gradle有默认地打包方案,但是同时提供非常方便地自定义功能 ( compile, classes, jar, assemble, build )
- 更高地cache管理,让打包更加高效
- Effortless extendibility - 允许使用task 自定义
- Integration with other build tools - ant,maven
- Continuous Delivery - 集成发布流程( 曾经这么做过,但是现代已经发生变化, 由Ci来触发)
8 当代的 webpack
- 更加强大的 default 选项
- 开发者友好地工具支持( dev-server/hot module replacement )
- Mode Support
9 Conclusion
Gradle是一个非常强大的工具,充分汲取了前辈们的教训,是一款非常成功构建工具。不过近几年的变化不是特别明显。或许可以从其他语言的构建框架中汲取营养,来完成理念上的进一步进化。不管怎么说,现在它是java项目的构建工具第一选项
【1】Breaking Open: Gradle https://www.youtube.com/watch?v=XXoIzzcJr80
【2】Apache Ant wiki https://en.wikipedia.org/wiki/Apache_Ant
【3】History of Maven by Jason van Zyl https://maven.apache.org/background/history-of-maven.html
Make build tool https://www.gnu.org/software/make/
Ant build tool https://ant.apache.org/
Maven build tool https://maven.apache.org/
Gant build tool https://gant.github.io/
Gradle build tool https://gradle.org/
Webpack build tool https://webpack.js.org/
网友评论