优秀特性和本质
Gradle能够提供给你的特性:
- 像Ant一样灵活通用的构建工具
- 又可以切换成像Maven一样基于约定的构建工具,但不会给你戴上枷锁
- 支持强大的多项目(工程)构建
- 拥有强大的依赖管理工具(基于Apache Ivy)
- 完美支持Maven或者Ivy仓库基础架构
- 即便在没有远程仓库,pom.xml和ivy.xml文件的情况下,也支持传递依赖的管理
- Gradle将Ant的任务和构建脚本作为它的一等公民
- 基于Groovy的构建脚本
- 完善的DSL(Domain Specific Language)和领域模型供你描述构建
- 更多优秀的特性,请参考本书后面的内容
Gradle的本质:
Gradle采用声明式的构建描述方式,其内心流淌的是Groovy的血液,依靠具有丰富可扩展性的DSL来描述项目的构建。
天生就具有面向对象编程语言的特性(天赋技能),所以具有完全灵活的构建任务自定义能力(但是比起Ant,更容易编写实现代码),同时也提供常用的基本任务可供扩展,比如,Copy,Test。
和前面对构建工具的定义一样,以任务的作为最小可执行单位,任务之间定义依赖关系(比如,A任务的执行依赖于B任务先执行),从而形成完善的任务链。
通过插件的形式(插件的本质就是一个Jar文件类库,可以用Groovy或者Java语言实现),来提供基于约定的构建(比如:和Maven一样的项目目录结构),包括配置和任务,但又提供灵活的DSL(类库的API)来自定义任务的配置(比如,改变项目源代码目录的位置)。
关于DSL
Martin Fowler将DSL分为两类:外部DSL和内部DSL(external DLS and internal DSL)。外部DSL是一种独立的可解析的语言,举一个最常见的是例子,SQL,它专注于数据库的操作。内部DSL是通用语言所暴露的用来执行特定任务的API,它利用语言本身的特性,将API以特殊的形式(或者格式)暴露出来的。比如,Martin Fowler给出了关于流接口(fluent interface)。
总结一下,外部DSL是一种特定的独立语言,内部DSL是通用语言为实现特殊目的提供的API。
我们可以看下Martin Fowler提供的关于流接口的一个例子。流接口的实现方式同样是通用语言的写法,但相对于连续的调用set方法或者add方法,可读性方面要好很多。
private void makeFluent(Customer customer) {
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
}
注解:
DSL(Domain Specific Language):领域特定语言,Martin Fowler,参考资料《领域特定语言》,ThoughtWorks中国译