Gradle中mustRunAfter和dependsOn之间有什么区别?

Dan*_* B. 21 dependencies task gradle

无论taskB mustRunAfter taskA,还是taskB dependsOn taskA,似乎taskA先运行,然后taskB运行.有什么不同?

mko*_*bit 31

例如:

tasks.create('a')

tasks.create('b').dependsOn('a')

tasks.create('c')

tasks.create('d').mustRunAfter('c')
Run Code Online (Sandbox Code Playgroud)
  • dependsOn - 设置任务依赖性.b在这里执行需要a先执行.
  • mustRunAfter - 设置任务排序.执行d不需要c.但是,无论何时cd包括,c将之前执行d.


her*_*ung 15

在可能的情况下,声明任务输入而不是任务依赖项。也就是说,扩展mkobit的答案:

涉及两个任务的顺序和依赖关系

mustRunAfter

mustRunAfter控制在命令行上显式指定的任务的执行顺序,但不会创建对其他任务的隐式依赖关系。给定taskAtaskB

构建.gradle.kts

val taskA by tasks.registering {
    doLast {
        println("taskA")
    }
}

val taskB by tasks.registering {
    doLast {
        println("taskB")
    }
}

taskB {
    mustRunAfter(taskA)
}
Run Code Online (Sandbox Code Playgroud)

然后

  • gradle taskB taskAtaskA随后执行taskB
  • gradle taskAtaskA仅执行;
  • gradle taskB仅执行taskB

dependsOn

dependsOn创建对其他任务的隐式依赖。给定相同的两个任务:

taskB {
    dependsOn(taskA)
}
Run Code Online (Sandbox Code Playgroud)

然后

  • gradle taskBtaskA随后执行taskB
  • gradle taskB taskAtaskA随后执行taskB
  • gradle taskA仅执行taskA

涉及三个任务的顺序和依赖关系

mustRunAfterdependsOn接受无序的任务集合。鉴于:

val taskC by tasks.registering {
    doLast {
        println("taskC")
    }
}

taskC {
    dependsOn(taskA, taskB)
}
Run Code Online (Sandbox Code Playgroud)

thengradle taskC执行taskA,并且taskB不保证顺序,然后执行taskC(假设没有其他dependsOn声明mustRunAfter)。

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

taskB {
    mustRunAfter(taskA)
}
Run Code Online (Sandbox Code Playgroud)

thengradle taskC执行taskA后跟taskB后跟taskC,但gradle taskB仅运行,taskA因为 taskB 不执行dependOn(taskA)

其他类型的任务依赖性

进一步阅读

请参阅 Gradle 文档以获取有关以下内容的更多信息:


Dan*_* B. 6

有时它们具有相同的效果。例如,如果 taskC 依赖于 taskA 和 taskB,那么 taskB 是依赖 taskA 还是 mustRunAfter 并不重要——当您运行 taskC 时,顺序将是 taskA、taskB、taskC。

但是如果 taskC 仅依赖于 taskB,那么就有区别了。如果 taskB 依赖于 taskA,那么它与上面相同 - taskA、taskB、taskC。如果 taskB 只是 mustRunAfter taskA,则 taskA 不会运行,并且运行 taskC 将运行 taskB,然后 taskC。

mustRunAfter 真的意味着如果 taskA 运行了,那么 taskB 必须在它之后运行。