首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Gradle 任务配置深度指南:配置阶段与执行阶段、依赖管理、任务排序

     編輯:Java 相關知識

任务生命周期:配置阶段 vs 执行阶段

Gradle 构建脚本分两阶段:

  1. 配置阶段:解析脚本、构建任务图、执行任务顶层代码(如 println、变量赋值)。
    所有任务的配置代码在每次构建都会执行,即使任务不运行。
  2. 执行阶段:仅运行显式调用或依赖链中的任务的 doLast/<< 闭包内代码。
task myTask {
    println "配置阶段执行" // 每次构建都打印
    doLast {
        println "执行阶段执行" // 仅 gradle myTask 时打印
    }
}

<< 是 doLast 语法糖,适合无配置逻辑的简单任务。

Groovy 闭包与委托机制

Gradle 脚本本质是 Groovy,大量使用闭包。闭包可捕获上下文变量,且可通过 setDelegate() 改变委托对象,实现 DSL。

def c = { println it }          // 隐式单参数 it
def c2 = { str, num -> println "$str:$num" }
c2("hello", 1)                  // hello:1

// 委托切换
class Ctx { def x = "from Ctx" }
def cl = { println x }
cl.setDelegate(new Ctx())
cl() // from Ctx

脚本块与 Project 委托

构建脚本顶层语句块(buildscript、allprojects、android 等)委托给特定对象:

  • buildscript { ... } → ScriptHandler → DependencyHandler
  • allprojects { ... } → Project
  • 插件可动态添加脚本块(如 android 块委托给 AppExtension)。

任务排序 API

1. dependsOn:强依赖

task A { doLast { println 'A' } }
task B { doLast { println 'B' } }
B.dependsOn A           // 执行 B 前必先执行 A
// 或配置块声明
task C { dependsOn B; doLast { println 'C' } }

可链式添加多依赖:B1.dependsOn B, Q。

2. mustRunAfter:顺序偏好(非强依赖)

task unit { doLast { println 'unit' } }
task ui   { doLast { println 'ui' } }
task test { dependsOn unit, ui; doLast { println 'test' } }
ui.mustRunAfter unit    // 同在任务图中时 ui 排在 unit 后,但单独执行 ui 不触发 unit

适合“单元测试优先于 UI 测试”但可独立运行的场景。

3. finalizedBy:终结动作

task mergeReports { doLast { println 'merge reports' } }
test.finalizedBy mergeReports
// 执行 test 后自动执行 mergeReports,用户无需感知

常用于清理、报告聚合等收尾工作。

实战建议

  • 配置阶段仅做轻量初始化,耗时逻辑放入 doLast。
  • 优先使用 dependsOn 表达强依赖,mustRunAfter 表达顺序偏好,finalizedBy 表达收尾动作。
  • 避免在配置阶段执行 IO、网络等耗时操作,拖慢所有构建命令。
  • 善用 tasks.withType<Test> { ... } 批量配置同类任务。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved