Gradle系列10-gradle生命周期钩子方法介绍

Gradle项目构建生命周期

Gradle的生命周期分三个阶段,初始化阶段,配置阶段,执行阶段。

初始化阶段

通过setting.gradle判断有哪些项目需要初始化,加载所有需要初始化的项目的build.gradle文件,并为每个项目创建Project对象

配置阶段

执行各项目下的build.gradle脚本,完成project配置,并且构造task任务依赖关系图以便在执行阶段按照依赖关系执行Task中的代码

配置代码: 配置阶段就需要执行的代码

task configCode{
	println 'config code'
}
执行阶段

通过配置阶段的Task依赖关系图,按顺序执行Task中的动作代码,就是执行Task中写在 doFirst和doLast的代码
动作代码: 任务调用才会执行的代码

	task executeCode {
		doLast{
			println 'execute code'
		}
	}

生命周期&钩子方法 图如下所示:
在这里插入图片描述

钩子方法使用的代码演示

打开setting.gradle 文件,添加如下代码:

gradle.settingsEvaluated {
    println 'init phase: settingsEvaluated'
}

gradle.projectsLoaded {
    println 'init phase: projectsLoaded'
}

gradle.beforeProject {
    println 'init phase: projectsLoaded'
}

添加后效果图展示:
在这里插入图片描述
在build.gradle中添加下面钩子方法:

task t1 {
    //配置代码
    println 't1 configuration'

    //动作代码
    doFirst {
        println 't1 execute doFirst'
    }
    doLast {
        println 't1 execute doLast'
    }
}

gradle.afterProject {
    println 'config phase: afterProject'
}

gradle.projectsEvaluated {
    println 'config phase: projectEvaluated'
}

//任务图
gradle.taskGraph.whenReady {
    println 'config phase: taskGraph.whenReady'
}

gradle.taskGraph.beforeTask{
    println 'execute phase: taskGraph.beforeTask'
}

gradle.taskGraph.afterTask {
    println "execute phase: taskGraph.afterTask"
}

gradle.buildFinished {
    println 'execute phase: buildFinished'
}

执行gralde build,结果如下

20:20:11: Executing task 'build'...

init phase: settingsEvaluated
init phase: projectsLoaded

> Configure project :
init phase: projectsLoaded
t1 configuration
config phase: afterProject
config phase: projectEvaluated
config phase: taskGraph.whenReady

> Task :compileJava UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :processResources NO-SOURCE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :classes UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :jar UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :assemble UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :compileTestJava NO-SOURCE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :processTestResources NO-SOURCE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :testClasses UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :test NO-SOURCE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :check UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask

> Task :build UP-TO-DATE
execute phase: taskGraph.beforeTask
execute phase: taskGraph.afterTask
execute phase: buildFinished

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 up-to-date
20:20:11: Task execution finished 'build'.

我们可以看到配置代码 log已经输出

t1 configuration

但是动作代码(doFirst&doLast)没有执行,之前我们实验已经了解这一结果,只执行build实际上类似java中的编译,没有实际去调用t1这个任务,下面我们双击other 下的t1来build并调用t1任务,输出结果如下:

20:46:12: Executing task 't1'...

init phase: settingsEvaluated
init phase: projectsLoaded

> Configure project :
init phase: projectsLoaded
t1 configuration
config phase: afterProject
config phase: projectEvaluated
config phase: taskGraph.whenReady

> Task :t1
execute phase: taskGraph.beforeTask
t1 execute doFirst
t1 execute doLast
execute phase: taskGraph.afterTask
execute phase: buildFinished

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
20:46:14: Task execution finished 't1'.

此处我们可以清晰的看到生命周期中的钩子方法执行顺序

发布了159 篇原创文章 · 获赞 22 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/ytuglt/article/details/105015808
今日推荐