DevOps实践05-Gradle使用小结

DevOps实践系列文章,请参见连接。

概述

Gradle是CI过程工具,而不是系统。持续集成过程中的构建、自动化测试、打包、发布都可以使用Gradle来完成。而持续进程过程为我们降低各方面成本,提高产品信心,提高产品质量有着非常重要的作用(不要问我为啥)。而我们很多研发人员非常讨厌CI过程,这一点的问题原因是研发人员没有从CI过程中获取任何利益,而且还增加了维护成本。关于这一点等有机会的时候和大家讨论一下《怎么统一研发,质量,测试,管理之间的利益》(统一各方面的利益之后众志成城,万众一心,我们的产品会更上一层楼)。

使用总结:

在使用Gradle过程中发现在Gradle中的很多特性,很多原理都很特别。这里说明几个使用实践。(这里不与makefile,maven,ant进行对比)

  • 关于Gradle的执行的过程:

很多介绍Gradle的地方,都说Gradle脚本是一种配置脚本。他们说这句话的原因是因为在Gradle中提供了很多插件,启用插件后直接调用方法闭包进行配置就可以完全完成项目需要的功能。所以,Gradle很多时候都是以配置文件的形式存在的。

但,Gradle的脚本不简单是配置文件。从Gradle执行的三个步骤可以看出:
1> Initialization:Gradle 支持单项目或者多项目构建,在该阶段,Gradle认哪些项目会参与构建,然后为每一个项目创建 Project 对象
2> Configuration:这个阶段就是配置 Initialization 阶段创建的 Project 对象,所有的配置脚本都会被执行
3> Execution:这个阶段 Gradle 会确认哪些在 Configuration 阶段创建和配置的 Task 会被执行,哪些 Task会被执行取决于gradle命令的参数以及当前的目录,确认之后便会执行

大家可以从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)

2> 在配置阶段,执行的是相关的配置。比如说Project中的依赖管理闭包块。属性设置等都会直接执行。但是这个阶段不会执行task内部的action。所以,这个阶段才叫做配置阶段。

3> 在执行阶段,会执行task的相关操作。在相对复杂的项目中很多时候需要在执行阶段对项目构建进行动态配置,在这个阶段可以对项目中各种属性在进行配置。但是,动态配置过程必须在使用这些配置之前完成,要不也没有任何用处。

所以,从上面可以得出,Gradle的执行过程不像我们之前接触过的CI工具那样要不是纯配置,要不是纯动态。这一点是Gradle很大的特点。这种方式为我们很好的融合了配置 与 动态构建过程,平衡了两方的优缺点。

  • Gradle配置过程

在脚本执行的时候,Gradle会配置一些特定类型的对象,这些对象就被称为脚本的 delegate 对象,也是构建领域的领域对象,下文简称 DO。
DO 的意义就在于脚本可以使用被代理的对象的方法——这一点非常重要,是脚本中可调用方法的重要来源。
参见:https://www.muzileecoding.com/gradlestudy/gradle-advaced-do.html

只要是被委托对象有的方法,都是可以直接调用的。而且还有一个比较复杂的方法查找过程,一层层的查找方法。所以,在查找在某一部分可以使用的方法是一个比较麻烦的过程。而在Gradle中的文档又写的很晦涩会导致学习成本提升,效率降低等问题。不过一般情况下直接查找DSL相关描述即可。

  • Gradle脚本模块化

模块化过程分两个大类:配置模块化 和 过程模块化。
配置模块化是将Gradle的脚本分模块的写道不同的脚本下,来提高Gradle脚本的可读性与可维护性。具体方法:

<pre>apply from: 'other.gradle'</pre>

使用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

  • 关于Groovy

在Gradle脚本中可以使用任意合法的Groovy语句。从Groovy的文档可以了解到Groovy是一种可以在运行期和编译器进行元编程的强大语言。元编程又是DSL的强大支撑。所以,Gradle才实现了这么强大的DSL,让我们更容易理解Gradle。
参见:http://www.groovy-lang.org/metaprogramming.html

总结:

总结了一些Gradle的实践,但是,这里最主要的核心内容还是怎么提高程序的可理解性,可维护性,可测试性的内容。提高这些更是为了降低成本。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,245评论 0 16
  • Android Studio作为Android应用开发的官方IDE,默认使用Gradle作为构建工具,所以对于An...
    feil0n9wan9阅读 1,581评论 1 6
  • 导语: 随着技术的发展,不管是前端开发、服务端开发或者是移动端开发(移动也是前端的一个分支)中都会用到自动化构建工...
    伊始雨深阅读 2,945评论 0 4
  • 目前为止,我们已经学习了如何修改Gradle构建属性,以及如何运行任务。本章,我们会深入了解这些属性,并且创建我们...
    sollian阅读 2,486评论 0 8
  • 本篇主要是个人学习gradle的笔记总结 一.开始之前 1. 为什么学习Gradle 采用DSL(Doma...
    zyq_neuq阅读 1,455评论 2 12