如何在Gradle任务图末尾执行任务?附lastTask实现方案疑问
嘿,这个问题我刚好踩过坑,来给你详细说清楚~
如何在Gradle任务图末尾执行任务?
要让一个任务在整个任务图的最后执行,核心思路是让这个任务依赖任务图中所有即将执行的任务,这样Gradle的执行引擎就会自动把它安排在所有任务完成后运行。常用的实现方式是借助gradle.taskGraph.whenReady回调,这个回调会在任务图构建完成、即将开始执行任务时触发。
仅用
project.taskgraph.whenReady{ lastTask }足够吗? 答案是不够。直接在whenReady里调用任务对象(比如lastTask),本质上是手动调用了任务的execute()方法,这会绕过Gradle的任务执行机制,带来几个问题:
- 不会自动执行
lastTask自身声明的依赖任务 - 跳过了Gradle的任务最新状态检查(up-to-date),哪怕
lastTask已经是最新的也会强制执行 - 不兼容并行执行、增量构建等Gradle核心特性,容易引发执行顺序或状态异常
正确的实现方式
下面是标准的写法,能确保lastTask在任务图末尾正确执行:
task lastTask { doLast { // 这里写你的任务逻辑 println "所有任务都完成啦,我是最后执行的任务!" } } gradle.taskGraph.whenReady { taskGraph -> // 让lastTask依赖任务图中所有要执行的任务 lastTask.dependsOn(taskGraph.allTasks) }
这样写的好处是:
- Gradle会自动处理
lastTask的依赖关系,确保它的前置任务先执行 - 遵守Gradle的所有执行规则,包括增量构建、并行执行等
- 不管你执行哪个任务组合(比如
./gradlew build或./gradlew test),lastTask都会在所有任务完成后运行
另外补充个小技巧:如果你只想让lastTask在特定任务执行时才跑最后,可以在whenReady里加个判断,比如:
gradle.taskGraph.whenReady { taskGraph -> if (taskGraph.hasTask(':build')) { lastTask.dependsOn(taskGraph.allTasks) } }
这样只有当执行:build相关任务时,lastTask才会作为最后一步执行。
内容的提问来源于stack exchange,提问作者KraffMann
相关产品推荐
相关产品推荐

