Appearance
任务依赖
任务依赖决定了任务的执行顺序。被依赖的任务会在依赖它的任务之前执行。
dependsOn - 声明依赖
kotlin
tasks.register("taskA") {
doLast { println("执行 A") }
}
tasks.register("taskB") {
dependsOn("taskA") // B 依赖 A,A 先执行
doLast { println("执行 B") }
}
tasks.register("taskC") {
dependsOn("taskA", "taskB") // 依赖多个任务
doLast { println("执行 C") }
}bash
./gradlew taskC
# > Task :taskA
# 执行 A
# > Task :taskB
# 执行 B
# > Task :taskC
# 执行 C使用任务引用(类型安全)
kotlin
val compileTask = tasks.register("compile") {
doLast { println("编译") }
}
tasks.register("test") {
dependsOn(compileTask) // 使用任务引用,类型安全
doLast { println("测试") }
}finalizedBy - 任务完成后执行
kotlin
tasks.register("integration") {
doLast { println("集成测试") }
}
tasks.register("startServer") {
doLast { println("启动服务器") }
}
tasks.register("stopServer") {
doLast { println("停止服务器") }
}
tasks.named("integration") {
dependsOn("startServer")
finalizedBy("stopServer") // 无论 integration 成功或失败,都会执行 stopServer
}mustRunAfter / shouldRunAfter - 顺序约束
kotlin
// mustRunAfter:如果两个任务都要执行,B 必须在 A 之后
tasks.named("taskB") {
mustRunAfter("taskA")
}
// shouldRunAfter:建议顺序(不强制,避免循环依赖时可忽略)
tasks.named("taskB") {
shouldRunAfter("taskA")
}与 dependsOn 的区别:
dependsOn:会触发依赖任务的执行mustRunAfter:只控制顺序,不触发执行
bash
# dependsOn: 执行 B 会自动执行 A
./gradlew taskB # 先执行 A,再执行 B
# mustRunAfter: 只有明确指定时才有顺序
./gradlew taskA taskB # 按 A → B 顺序
./gradlew taskB # 只执行 B,不执行 A动态添加依赖
kotlin
// 向现有任务添加依赖
tasks.named("build") {
dependsOn("checkLicense")
}
// 向所有 Test 任务添加依赖
tasks.withType<Test> {
dependsOn("startTestDB")
}任务依赖图可视化
bash
# 查看 build 任务的依赖链
./gradlew build --dry-run
# 输出:
# :compileJava SKIPPED
# :processResources SKIPPED
# :classes SKIPPED
# :jar SKIPPED
# :compileTestJava SKIPPED
# :processTestResources SKIPPED
# :testClasses SKIPPED
# :test SKIPPED
# :check SKIPPED
# :assemble SKIPPED
# :build SKIPPED