Gradle配置文件拆解
gradle配置文件里的内容其实“方法调用”,长得类似与json,其实是groovy中的“闭包”(Closure)知识:把方法当作形参传递进去
java中无法把方法当形参传递,有类似的监听(把方法放进一个类中,用匿名内部类的形式把类的对象传进去)(里面的回调就是延后执行的)【=>闭包内容不一定马上执行】
java8之后有了lambda表达式,可以简化写法,实际传的还是匿名内部类的对象
闭包是最后一个参数,可以挪到()外
buildscript的repositories控制dependencies的来源,dependencies控制插件的来源
classpath在具体实现类中DefaultDependencyHandler.groovy也找不到,但这个groovy中有定义methodMissing方法
Gradle是什么
- 是构建工具,不是语言
- 它用了
Groovy这个语言,创造了一种DSL,但它本身不是语言
怎么构建
- 按照
gradle的规则(build.gradle、settings.gradle、gradle-wrapper、gradle语法)
闭包
- 相当于可以被传递的代码块
compile,implementation 和 api
implementation:不会传递依赖compile / api:会传递依赖;api是compile的替代品,效果完全等同当依赖被传递时,二级依赖的改动会导致0级项目重新编译;当依赖不传递时,二级依赖的改动不会导致0级项目重新编译
Gradle项目结构,以及Task
项目结构
单
project:build.gradle多
project:由settings.gradle配置多个查找
settings的顺序:- 当前目录
- 兄弟目录
master - 父目录
Task
使用方法:
./gradlew taskNametask 的结构:
1
2
3
4
5
6
7
8
9task taskName{
初始化代码
doFirst{
task 代码
}
doLast {
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 的最后
⼆三阶段之间:
1 | afterEvaluate { |