type
status
date
slug
summary
tags
category
password
icon
gradle 是什么
- 是构建⼯具,不是语⾔
- 它⽤了 Groovy 这个语⾔,创造了⼀种 DSL,但它本身不是语⾔
怎么构建?
- 按照 gradle 的规则(build.gradle、settings.gradle、gradle-wrapper、gradle 语法)
闭包
- Java 的 Lambda 表达式:是单抽象⽅法(SAM)的接⼝的匿名类对象的快捷写法,只是⼀个语法糖。
- Kotlin 的 Lambda 表达式:和匿名函数相当,实质上是⼀个函数类型的对象,并不只是语法糖。
- Groovy 的 Lambda 表达式:Groovy ⾥不叫「Lambda」表达式,⽽是叫「闭包」;在功能上,和 Kotlin 的 Lambda ⽐较相似,都是⼀个「可以传递的代码块」,具体的功能⽐ Kotlin 的 Lambda 更强⼀些,但基本的概念是⼀样的。
为什么 Groovy 可以写出类似 JSON 格式的配置?
因为它们其实都是⽅法调⽤,只是⽤闭包来写成了看起来像是 JSON 型的格式。
Groovy 是动态语言,在设计 Gradle 时,编译时,如果A这个类并没有 B(args) 这个方法,但是 A 中有一个
invokeMethod(String name,Object args):Object
的方法,运行时,A.B(args) 就会去调用 invokeMethod("B",args)
buildTypes 和 roductFlavors

compile, implementation 和 api
- implementation:不会传递依赖
- compile / api:会传递依赖;api 是 compile 的替代品,效果完全等同
- 当依赖被传递时,⼆级依赖的改动会导致 0 级项⽬重新编译;当依赖不传递时,⼆级依赖的改动不会导致 0 级项⽬重新编译
Gradle Wrapper
- 通过「只同步版本,不同步⽂件」的⽅式来减⼩协作项⽬的⼤⼩
- 每个⼈电脑上的 Gradle 存放在固定位置,然后使⽤ Gradle Wrapper 的配置来取⽤对应的版本就⾏了
task
- 使⽤⽅法:./gradlew taskName
- task 的结构:
- doFirst() doLast() 和普通代码段的区别:
- 普通代码段:在 task 创建过程中就会被执⾏,发⽣在 configuration 阶段——配置阶段
- doFirst() 和 doLast():在 task 执⾏过程中被执⾏,发⽣在 execution 阶段。如果⽤户没有直接或间接执⾏ task,那么它的 doLast() doFirst() 代码不会被执⾏
- doFirst() 和 doLast() 都是 task 代码,其中 doFirst() 是往队列的前⾯插⼊代码,doLast() 是往队列的后⾯插⼊代码
- task 的依赖:可以使⽤
task taskA(dependsOn: b)
的形式来指定依赖。指定依赖后,task 会在⾃⼰执⾏前先执⾏⾃⼰依赖的 task。
gradle 执⾏的⽣命周期
三个阶段:
- 初始化阶段:执⾏ settings.gradle,确定主 project 和⼦ project
- 定义阶段:执⾏每个 project 的 bulid.gradle,确定出所有 task 所组成的有向⽆环图
- 执⾏阶段:按照上⼀阶段所确定出的有向⽆环图来执⾏指定的 task
在阶段之间插⼊代码:
- ⼀⼆阶段之间:
- settings.gradle 的最后
- ⼆三阶段之间:
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/a4dad950-5d83-4306-8e31-76ab13a84ce7
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。