有道无术,术尚可求,有术无道,止于术。
构建生命周期
Gradle 的核心是一种基于依赖的编程语言。在Gradle 术语中,这意味着您可以定义任务和任务之间的依赖关系。Gradle 保证这些任务按照它们的依赖顺序执行,并且每个任务只执行一次。
这些任务形成了一个有向无环图。有一些构建工具可以在执行任务时构建这样的依赖关系图。Gradle 在执行任何任务之前构建完整的依赖关系图。这是 Gradle 的核心,它使许多原本不可能的事情成为可能。
构建阶段
Gradle 构建具有三个不同的阶段。
-
初始化:Gradle 支持单项目和多项目构建。在初始化阶段,Gradle 确定哪些项目将参与构建,并为每个项目创建一个Project实例。 -
配置:解析所有project中的build.gradle 文件获取所有的task,形成有向无环图后执行依赖关系。并且所有project中的build script 部分和task 的配置段会在这一阶段调用(注意并不是执行具体的task代码)。 -
执行任务:Gradle 确定在配置阶段创建和配置的要执行的任务子集。该子集由传递给gradle命令和当前目录的任务名称参数确定。Gradle 然后执行每个选定的任务。
settings 文件
除了构建脚本文件,Gradle 还定义了一个settings 文件,该文件由 Gradle 通过命名约定确定,默认名称是settings.gradle 。
settings 文件在初始化阶段执行,多项目构建必须在settings.gradle 定义项目层次结构。这是必需的,因为文件定义了哪些项目参与了多项目构建。对于单项目构建,设置文件是可选的。
声明实例化和配置Project参与构建的实例层次结构所需的配置。
Settings 实例和settings.gradle 文件之间存在一一对应的关系。在 Gradle 构建项目之前,会创建一个 Settings实例 。
Settings 实例的属性如下图: Settings 实例的方法如下图:
生命周期监听
gradle 在生命周期三个阶段都设置了相应的钩子函数调用。
初始化
gradle.beforeSettings {
println '在settings加载之前执行,但是这个函数又放在了settings中,所以不会执行'
}
gradle.settingsEvaluated {
println 'settings脚本执行完成之后调用'
}
gradle.projectsLoaded {
println "所有的project对象加载完成"
}
gradle.addBuildListener(new BuildListener() {
@Override
void beforeSettings(Settings settings) {
super.beforeSettings(settings)
}
@Override
void settingsEvaluated(Settings settings) {}
@Override
void projectsLoaded(Gradle gradle) {}
})
配置
gradle.beforeProject{ project ->
println 'beforeProject $project'
}
gradle.afterProject{ project ->
println 'afterProject $project'
}
gradle.projectsEvaluated {
println 'projectsEvaluated'
}
gradle.taskGraph.whenReady { graph ->
println 'whenReady'
}
gradle.addListener(new TaskExecutionGraphListener() {
@Override
void graphPopulated(TaskExecutionGraph taskExecutionGraph) {
println "TaskExecutionGraphListener.graphPopulated"
}
})
public class DemoPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.beforeEvaluate {
println("beforeEvaluate")
}
}
}
基于此,我们想在解析`build.gradle`之前,改变`build.gradle`文件的内容,可以在
beforeEvaluate() 这个方法里修改`build.gradle`。
执行
gradle.taskGraph.beforeTask {
}
gradle.taskGraph.afterTask {
}
gradle.addListener(new TaskActionListener() {
@Override
void beforeActions(Task task) {
}
@Override
void afterActions(Task task) {
}
})
文档参考来源
君哥的学习笔记
|