构建脚本概要
- Gradle 构建脚本中最重要的两个概念是
project与Task,任何一个Gradle构建都一个或多个project组成,每个 project 包括许多的构建部分,可以是一个 jar 包,也可以是一个web应用,也可以是多个 jar 的整合,可以部署应用和搭建环境 - 每个 project 由一个或多个 Taks 组成,每个 Task 表示在构建执行过程中的
一个原子操作。如编译打包生成 javadoc发布到仓库等操作 - 依赖关系
- Task间,有依赖关系,先构建被依赖项,如 Task A依赖与 Task B,则先构建Task B,再构建Task A
- Project间,有依赖关系,也是先构建依赖项,如 Project1 中的 Task C 依赖与(depends on)Project2中的Task D,Project2 中 Task D 又依赖Task E,则构建顺序为,(Project2)Task E → (Project2)Task D → (Project1)Task C
Project 对象介绍
- 一个 project 代表一个正在构建的组件(jar/war文件),当构建开始时,Gradle 会基于
build.gradle实例化一个org.gradle.api.Project对象,并通过project变量来隐式调用其成员,成员如下:
| 名字 | 类型 | 默认值 |
|---|---|---|
| project | Project | Project 实例 |
| group | Object | 项目分组:未指定 |
| name | String | 项目目录名 |
| version | Object | 项目版本:未指定 |
| path | String | 项目绝对路径 |
| description | String | 项目描述 |
| projectDir | File | 包含生成脚本目录 |
| buildDir | File | projectDir/build |
| ant | AntBuilder | AntBuilder 实例 |
-
Project 中常用的属性有 project(即build.gradle本身),group,name,version
-
Project 其他常用的配置
- plugins,apply plugin 用来引入插件使用
- dependencies 依赖配置
- repositories 仓库配置
- task 任务书写
- ext,gradle.properties Project 中属性的其他配置方式
- 所有的配置都会被封装到一个Project的实例对象中,
build.gradle中任何无主的方法都会去Project类中查找,即 Project 是build.gradle中的无主方法的隐式对象,类似与Java中的this
Gradle 项目构建生命周期
-
Initialization(初始化阶段),通过
settings.gradle判断有哪些项目需要进行初始化,加载所有需要初始化的项目的build.gradle文件并为每个项目创建project对象 -
Configuration(配置阶段),
扫描各项目下的build.gradle脚本,对project进行配置(执行哪些任务,运行哪些插件,执行哪些逻辑),并且构造Task 任务关系依赖图以便在执行阶段按照依赖关系执行Task中的配置代码(如println方法) -
Execution(执行阶段),通过配置阶段的 Task 图,按顺序执行需要执行的 任务中的动作代码,就是执行
doFirst或doLast等代码
task任务介绍
- 每个任务在构建执行过程中会被
封装成 org.gradle.api.Task对象,主要包括任务的动作和任务的依赖.任务动作定义了一个原子操作,可以定义依赖其他任务、动作顺序、执行条件,与任务相关的操作如下
dependsOn:依赖相关操作doFirst:任务执行之前的方法doLast <<任务执行之后的方法
- 生命周期介绍
-
Initialization
- 读取项目信息,确定是单项目还是多项目工程,然后确认哪些项目是要参与进来,并为他们创建Project 实例,一般我们不会接触
-
Configuration(构建阶段)
- 进行配置,从头到尾将build.gradle脚本跑一遍。不运行项目,只是对构建进行一些配置,本质就是对build.gradle执行一次,例如执行哪些任务,运行哪些插件,执行哪些逻辑
-
Execution
- 运行阶段。具体执行哪些task,可以使用
./gradlew task_name执行单个任务,如果单个任务中依赖doLast或doFirst等钩子函数中的其他任务,则其他被依赖的任务也会被调用执行;如果使用build则只是构建项目,在Configuration阶段扫描一下配置,并不会执行其依赖的任务但是,若任务参数显示使用dependsOn某个任务,则依赖的任务会执行
- 运行阶段。具体执行哪些task,可以使用
-
构建只会执行普通语句,执行阶段才会调用钩子函数(doLast等)
- 在命令行使用
./gradlew task_name代表构建项目、执行任务,会有两个阶段,Configuration阶段会执行任务中的类似与println语句,然后在Execution阶段会执行doFirst或doLast等钩子函数,如果单个任务中依赖doLast或doFirst等钩子函数中的其他任务,则其他被依赖的任务也会被调用执行; - 如果使用
build则只是构建项目,在Configuration阶段扫描一下配置,执行内部的相关语句,并不会执行其依赖的任务但是,若任务参数显示使用dependsOn某个任务,则被依赖的任务会执行
- 在命令行使用
- 生命周期应用
Task。task是gardle中最小的任务单元,任务之间可以进行复杂的操作(动态创建任务,多任务间依赖调用)- 用法。task('helloworld',Closure closure),
helloworld即当前任务的名字,closure闭包作用是对helloworld任务进行Configuration,使用命令./gradlew helloworld即构建并执行任务可以在closure中调用doLast或dependsOn等方法。我们可以在helloworld的Configuration期间进行wrapper(例如,调用其他任务,或者动态调用任务等) - dependsOn方法,方法参数为其他任务的名字。多任务中通过该方法可执行所依赖的其他任务
- doLast,在生命周期的configuration阶段,将doLast闭包函数放在任务的最后,
并不执行,执行任务时(命令行执行./gradlew task_name或IDE的gradle插件单击指定task),会调用该方法。doFirst相反
- 用法。task('helloworld',Closure closure),
- 任务的依赖配置
dependsOn,先执行依赖任务,再执行本任务
- 任务参数依赖,先执行参数中的依赖,再执行本任务
- 任务内部依赖,先执行依赖的任务,再执行本任务
- 外部添加依赖,先执行依赖的任务
- 动态任务
4.times{val ->
task"tk${val}"<<{
println "this task name is task${val}"
}
}
- 给任务自定义属性
task t1{
ext.myProperty="task's property"
doFirst{
println("t1 ${myProperty}")
}
}
//输出,t1 task's property