什么';Gradle中mustRunAfter和dependsOn的区别是什么?

什么';Gradle中mustRunAfter和dependsOn的区别是什么?,gradle,dependencies,task,Gradle,Dependencies,Task,无论taskB必须在taskA之后运行,还是taskB依赖于taskA,似乎taskA先运行,taskB再运行。有什么区别吗?有时它们有相同的效果。例如,如果taskC依赖于taskA和taskB,则taskB依赖于taskA还是必须在其之后运行并不重要-当您运行taskC时,顺序将为taskA、taskB、taskC 但如果taskC仅依赖于taskB,则存在差异。如果taskB依赖于taskA,那么它与上面的taskA、taskB、taskC相同。如果taskB仅在taskA之后运行,则ta

无论taskB必须在taskA之后运行,还是taskB依赖于taskA,似乎taskA先运行,taskB再运行。有什么区别吗?

有时它们有相同的效果。例如,如果taskC依赖于taskA和taskB,则taskB依赖于taskA还是必须在其之后运行并不重要-当您运行taskC时,顺序将为taskA、taskB、taskC

但如果taskC仅依赖于taskB,则存在差异。如果taskB依赖于taskA,那么它与上面的taskA、taskB、taskC相同。如果taskB仅在taskA之后运行,则taskA不运行,而运行taskC将运行taskB,然后taskC运行

mustRunAfter实际上意味着如果taskA运行,那么taskB必须在其之后运行。

例如:

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
    之前执行

通常,如果订单很重要,那么您似乎需要dependsOn和mustRunAfter。下面是一个运行两个任务的示例,一个(自定义注册的“ImportionCodeFiles”任务)位于“此”项目中,另一个(预定义的“运行”任务)位于名为:unicode的同级项目中:

在下面的回答中展开:

涉及两个任务的排序和依赖关系
mustRunAfter
mustRunAfter
控制在命令行上显式指定的任务的执行顺序,但不创建对其他任务的隐式依赖关系。给定
taskA
taskB

build.gradle.kts

val taskA by tasks.registing{
多拉斯特{
println(“taskA”)
}
}
val taskB by tasks.registing{
多拉斯特{
println(“taskB”)
}
}
任务B{
mustRunAfter(taskA)
}
然后

  • gradle taskB taskA
    执行
    taskA
    ,然后执行
    taskB
  • gradle taskA
    仅执行
    taskA
  • gradle taskB
    仅执行
    taskB
dependsOn
dependsOn
创建对其他任务的隐式依赖。考虑到同样的两个任务:

taskB{
德彭森(任务A)
}
然后

  • gradle taskB
    执行
    taskA
    ,然后执行
    taskB
  • gradle taskB taskA
    执行
    taskA
    ,然后执行
    taskB
  • gradle taskA
    仅执行
    taskA
涉及三个任务的排序和依赖关系
mustRunAfter
dependsOn
接受请求。鉴于:

val taskC by tasks.registing{
多拉斯特{
println(“taskC”)
}
}
任务C{
dependsOn(任务A、任务B)
}
然后,
gradle taskC
以无保证的顺序执行
taskA
taskB
,然后执行
taskC
(假设没有其他
dependsOn
必须在
声明之后运行)

mustRunAfter
还控制相互依赖的任务之间的执行顺序,否则这些任务将无法保证顺序。鉴于:

taskB{
mustRunAfter(taskA)
}
然后
gradle taskC
执行
taskA
,然后执行
taskB
,然后执行
taskC
,但是
gradle taskB
只运行
taskA
,因为taskB不依赖于(taskA)

其他类型的任务依赖关系
  • taskA{finalizedBy(taskB)}
    确保
    gradle taskA
    执行
    taskA
    ,然后执行
    taskB
  • shouldlrunafter
    提供的订购保证比
    mustRunAfter
进一步阅读 有关以下方面的更多信息,请参阅Gradle文档:


这是否意味着
b.dependsOn(a)
不会将
a
的输出添加到
b
的输入中?因此
a
可以在不运行
b
的情况下运行吗?@AnthonyD973否,本例中的输入不是隐式传递的。不过,Gradle确实支持基于其他领域的输入/输出的依赖性推理。
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)
}