Skip to content

任务依赖

任务依赖决定了任务的执行顺序。被依赖的任务会在依赖它的任务之前执行。

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

下一步