【问题标题】:What's the difference between mustRunAfter and dependsOn in Gradle?Gradle中的mustRunAfter和dependsOn有什么区别?
【发布时间】:2017-06-21 08:53:27
【问题描述】:

taskB 必须在 taskA 之后运行,还是 taskB 依赖于 taskA,看来 taskA 先运行,然后 taskB 运行。有什么区别?

【问题讨论】:

    标签: gradle dependencies task


    【解决方案1】:

    在可能的情况下,declare task inputs instead of task dependencies。也就是说,扩展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)
    }
    

    然后gradle taskC 执行taskA 后跟taskB 后跟taskC,但gradle taskB 只运行taskA 因为taskB 没有dependOn(taskA)

    其他类型的任务依赖

    进一步阅读

    请参阅 Gradle 文档以获取更多信息:

    【讨论】:

      【解决方案2】:

      一般来说,如果顺序很重要,您似乎同时需要 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】:

        例如:

        tasks.create('a')
        
        tasks.create('b').dependsOn('a')
        
        tasks.create('c')
        
        tasks.create('d').mustRunAfter('c')
        
        • dependsOn - 设置任务依赖。在此处执行b 需要先执行a
        • mustRunAfter - 设置任务排序。执行d 不需要c。但是,当cd 都包含在内时,c 将在d 之前执行。

        【讨论】:

        • 这是否意味着b.dependsOn(a) 不会将a 的输出添加到b 的输入中?那么a 可以在不运行b 的情况下运行吗?
        • @AnthonyD973 不,此示例中的输入未隐式传递。不过,Gradle 确实支持基于其他领域的输入/输出的依赖关系推断。
        【解决方案4】:

        有时它们具有相同的效果。例如,如果 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 必须在它之后运行。

        【讨论】:

          猜你喜欢
          • 2018-10-05
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-20
          • 2017-11-13
          相关资源
          最近更新 更多