Gradle 构建脚本分两阶段:
println、变量赋值)。doLast/<< 闭包内代码。task myTask {
println "配置阶段执行" // 每次构建都打印
doLast {
println "执行阶段执行" // 仅 gradle myTask 时打印
}
}
<< 是 doLast 语法糖,适合无配置逻辑的简单任务。
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
构建脚本顶层语句块(buildscript、allprojects、android 等)委托给特定对象:
buildscript { ... } → ScriptHandler → DependencyHandlerallprojects { ... } → Projectandroid 块委托给 AppExtension)。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。
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 测试”但可独立运行的场景。
task mergeReports { doLast { println 'merge reports' } }
test.finalizedBy mergeReports
// 执行 test 后自动执行 mergeReports,用户无需感知
常用于清理、报告聚合等收尾工作。
doLast。dependsOn 表达强依赖,mustRunAfter 表达顺序偏好,finalizedBy 表达收尾动作。tasks.withType<Test> { ... } 批量配置同类任务。