【发布时间】:2017-06-21 08:53:27
【问题描述】:
taskB 必须在 taskA 之后运行,还是 taskB 依赖于 taskA,看来 taskA 先运行,然后 taskB 运行。有什么区别?
【问题讨论】:
标签: gradle dependencies task
taskB 必须在 taskA 之后运行,还是 taskB 依赖于 taskA,看来 taskA 先运行,然后 taskB 运行。有什么区别?
【问题讨论】:
标签: gradle dependencies task
在可能的情况下,declare task inputs instead of task dependencies。也就是说,扩展mkobit 的答案:
mustRunAftermustRunAfter 控制在命令行中明确指定的任务的执行顺序,但不会创建对其他任务的隐式依赖。给定taskA 和taskB:
build.gradle.kts
val taskA by tasks.registering {
doLast {
println("taskA")
}
}
val taskB by tasks.registering {
doLast {
println("taskB")
}
}
taskB {
mustRunAfter(taskA)
}
然后
gradle taskB taskA 执行 taskA 后跟 taskB;gradle taskA 仅执行 taskA;gradle taskB 仅执行 taskB。dependsOndependsOn 创建对其他任务的隐式依赖。给定相同的两个任务:
taskB {
dependsOn(taskA)
}
然后
gradle taskB 执行 taskA 后跟 taskB;gradle taskB taskA 执行 taskA 后跟 taskB;gradle taskA 仅执行 taskA。mustRunAfter 和 dependsOn 接受 unordered collection of tasks。给定:
val taskC by tasks.registering {
doLast {
println("taskC")
}
}
taskC {
dependsOn(taskA, taskB)
}
然后gradle taskC 以无保证的顺序执行taskA 和taskB,然后是taskC(假设没有其他dependsOn 或mustRunAfter 声明)。
mustRunAfter 还控制相互依赖的任务之间的执行顺序,否则这些任务将无法保证顺序。给定:
taskB {
mustRunAfter(taskA)
}
然后gradle taskC 执行taskA 后跟taskB 后跟taskC,但gradle taskB 只运行taskA 因为taskB 没有dependOn(taskA)。
taskA { finalizedBy(taskB) } 确保 gradle taskA 执行 taskA 后跟 taskB;shouldRunAfter 提供比mustRunAfter、useful for breaking cyclic dependencies and parallel task execution 更弱的排序保证。请参阅 Gradle 文档以获取更多信息:
【讨论】:
一般来说,如果顺序很重要,您似乎同时需要 dependsOn 和 mustRunAfter。这是运行两个任务的示例,一个(自定义注册的“importUnicodeFiles”任务)在“this”项目中,另一个(预定义的“run”任务)在名为“:unicode”的同级项目中:
tasks.register("rebuildUnicodeFiles") {
description = "Force the rebuild of the `./src/main/resources/text` data"
val make = project(":unicode").tasks["run"]
val copy = tasks["importUnicodeFiles"]
dependsOn(make)
dependsOn(copy)
copy.mustRunAfter(make)
}
【讨论】:
例如:
tasks.create('a')
tasks.create('b').dependsOn('a')
tasks.create('c')
tasks.create('d').mustRunAfter('c')
dependsOn - 设置任务依赖。在此处执行b 需要先执行a。mustRunAfter - 设置任务排序。执行d 不需要c。但是,当c 和d 都包含在内时,c 将在d 之前执行。【讨论】:
b.dependsOn(a) 不会将a 的输出添加到b 的输入中?那么a 可以在不运行b 的情况下运行吗?
有时它们具有相同的效果。例如,如果 taskC 依赖于 taskA 和 taskB,那么无论 taskB 依赖于 taskA 还是 mustRunAfter 它都无关紧要 - 当您运行 taskC 时,顺序将是 taskA、taskB、taskC。
但如果 taskC 只依赖于 taskB,那就有区别了。如果 taskB 依赖于 taskA,则同上 - taskA, taskB, taskC。如果taskB只是必须在taskA之后运行,那么taskA不会运行,而运行taskC会运行taskB,然后是taskC。
mustRunAfter 真正的意思是如果 taskA 完全运行,那么 taskB 必须在它之后运行。
【讨论】: