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'.
此处我们可以清晰的看到生命周期中的钩子方法执行顺序