Gradle是CI过程工具,而不是系统。持续集成过程当中的构建、自动化测试、打包、发布均可以使用Gradle来完成。而持续进程过程为咱们下降各方面成本,提升产品信心,提升产品质量有着很是重要的做用(不要问我为啥)。而咱们不少研发人员很是讨厌CI过程,这一点的问题缘由是研发人员没有从CI过程当中获取任何利益,并且还增长了维护成本。关于这一点等有机会的时候和你们讨论一下《怎么统一研发,质量,测试,管理之间的利益》(统一各方面的利益以后众志成城,万众一心,咱们的产品会更上一层楼)。html
在使用Gradle过程当中发如今Gradle中的不少特性,不少原理都很特别。这里说明几个使用实践。(这里不与makefile,maven,ant进行对比)java
1.关于Gradle的执行的过程:
不少介绍Gradle的地方,都说Gradle脚本是一种配置脚本。他们说这句话的缘由是由于在Gradle中提供了不少插件,启用插件后直接调用方法闭包进行配置就能够彻底完成项目须要的功能。因此,Gradle不少时候都是以配置文件的形式存在的。编程
但,Gradle的脚本不简单是配置文件。从Gradle执行的三个步骤能够看出:
1>Initialization:Gradle 支持单项目或者多项目构建,在该阶段,Gradle认哪些项目会参与构建,而后为每个项目建立 Project 对象
2>Configuration:这个阶段就是配置 Initialization 阶段建立的 Project 对象,全部的配置脚本都会被执行
3>Execution:这个阶段 Gradle 会确认哪些在 Configuration 阶段建立和配置的 Task 会被执行,哪些 Task会被执行取决于gradle命令的参数以及当前的目录,确认以后便会执行api
你们能够从Gradle执行过程得出,Gradle的使用过程不止配置脚本那么简单。具体能够看:
1>在初始化阶段,Gradle没有指定默认的初始化脚本,必须使用Gradle的命令行参数进行指定。这个过程可使用Gradle的Hook来完成相应的回调注册,以控制整个Gradle执行过程。闭包
参见:https://docs.gradle.org/current/userguide/init_scripts.html
https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html#org.gradle.api.invocation.Gradle:addListener(java.lang.Object)app
2>在配置阶段,执行的是相关的配置。好比说Project中的依赖管理闭包块。属性设置等都会直接执行。可是这个阶段不会执行task内部的action。因此,这个阶段才叫作配置阶段。maven
3>在执行阶段,会执行task的相关操做。在相对复杂的项目中不少时候须要在执行阶段对项目构建进行动态配置,在这个阶段能够对项目中各类属性在进行配置。可是,动态配置过程必须在使用这些配置以前完成,要不也没有任何用处。ide
因此,从上面能够得出,Gradle的执行过程不像咱们以前接触过的CI工具那样要不是纯配置,要不是纯动态。这一点是Gradle很大的特色。这种方式为咱们很好的融合了配置 与 动态构建过程,平衡了两方的优缺点。模块化
2.Gradle配置过程
在脚本执行的时候,Gradle会配置一些特定类型的对象,这些对象就被称为脚本的 delegate 对象,也是构建领域的领域对象,下文简称 DO。
DO 的意义就在于脚本可使用被代理的对象的方法——这一点很是重要,是脚本中可调用方法的重要来源。
参见:https://www.muzileecoding.com/gradlestudy/gradle-advaced-do.html工具
只要是被委托对象有的方法,都是能够直接调用的。并且还有一个比较复杂的方法查找过程,一层层的查找方法。因此,在查找在某一部分可使用的方法是一个比较麻烦的过程。而在Gradle中的文档又写的很晦涩会致使学习成本提高,效率下降等问题。不过通常状况下直接查找DSL相关描述便可。
3.Gradle脚本模块化
模块化过程分两个大类:配置模块化 和 过程模块化。
配置模块化是将Gradle的脚本分模块的写道不一样的脚本下,来提升Gradle脚本的可读性与可维护性。具体方法:
apply from: 'other.gradle'
使用apply来引入其余的脚本,可是,在真正使用过程当中发现被引入的脚本的委托对象好像不像通常脚本那样。不能直接使用Project一些特定的属性或者task,只能在主脚本中经过不一样的方式进行调用。
过程模块化是在被引入脚本中实现过程,方法,类等等,可是须要在主脚本里进行调用。这种方法可使用Gradle直接调用groovy脚本中的实现来完成,可是,没有找到方法来使Gradle脚本调用groovy脚本。因此,这里的过程模块化仍是使用配置模块化来进行引入。不过使用特殊的方式进行方法,类的导出。具体以下:
// Define methods as usual def commonMethod1(param){ return true } def commonMethod2(param){ return true } // Export methods by turning them into closures ext{ commonMethod1 = this.&commonMethod1 otherNameForMethod2 = this.&commonMethod2 }
在被引入脚本中使用ext进行导出,在主脚本中就能够正常使用了。
参见:http://stackoverflow.com/questions/18715137/extract-common-methods-from-gradle-build-script
https://docs.gradle.org/current/userguide/organizing_build_logic.html#sec:configuring_using_external_script
4.关于Groovy
在Gradle脚本中可使用任意合法的Groovy语句。从Groovy的文档能够了解到Groovy是一种能够在运行期和编译器进行元编程的强大语言。元编程又是DSL的强大支撑。因此,Gradle才实现了这么强大的DSL,让咱们更容易理解Gradle。
参见:http://www.groovy-lang.org/metaprogramming.html
总结了一些Gradle的实践,可是,这里最主要的核心内容仍是怎么提升程序的可理解性,可维护性,可测试性的内容。提升这些更是为了下降成本。