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

时间:2017-02-03 21:44:34

标签: gradle dependencies task

taskB mustRunAfter taskA或taskB dependsOn taskA,似乎taskA先运行,然后taskB运行。有什么区别?

4 个答案:

答案 0 :(得分:22)

例如:

tasks.create('a')

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

tasks.create('c')

tasks.create('d').mustRunAfter('c')
  • dependsOn - 设置任务依赖关系。在此执行b将要求首先执行a
  • mustRunAfter - 设置任务排序。执行d不需要c。但是,如果同时包含cdc将在d之前执行。

答案 1 :(得分:1)

有时它们具有相同的效果。例如,如果taskC依赖于taskA和taskB,那么taskB依赖于taskA或mustRun是否无关紧要 - 当你运行taskC时,顺序将是taskA,taskB,taskC。

但是如果taskC仅依赖于taskB,那么就会有所不同。如果taskB依赖于taskA,那么它与上面的相同 - taskA,taskB,taskC。如果taskB只是必须在任务A之后运行,那么taskA就不会运行,并且运行taskC将运行taskB,然后运行taskC。

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

答案 2 :(得分:0)

通常,如果顺序很重要,则看来您同时需要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)
}

答案 3 :(得分:0)

扩展mkobit的回答:

涉及两个任务的排序和依赖

mustRunAfter

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

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

dependsOn

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

taskB {
    dependsOn(taskA)
}

然后

  • gradle taskB 执行 taskA 后跟 taskB;
  • gradle taskB taskA 执行 taskA 后跟 taskB;
  • gradle taskA 仅执行 taskA

涉及三个任务的排序和依赖

mustRunAfterdependsOn 接受 unordered collection of tasks。鉴于:

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

taskC {
    dependsOn(taskA, taskB)
}

然后 gradle taskC 以无保证的顺序执行 taskAtaskB,然后是 taskC(假设没有其他 dependsOnmustRunAfter 声明) .

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

taskB {
    mustRunAfter(taskA)
}

then gradle taskC 执行 taskA 后跟 taskB 后跟 taskC,但 gradle taskB 只执行 taskA,因为 taskB 没有 {{1 }}。

其他类型的任务依赖

进一步阅读

有关以下方面的更多信息,请参阅 Gradle 文档: