构建脚本概要
- 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