【问题标题】:How to make Gradle run tasks in certain order?如何让 Gradle 按特定顺序运行任务?
【发布时间】:2014-12-14 00:00:21
【问题描述】:

假设我在我的 gradle 构建脚本中创建了单独的任务来运行集成和验收测试。当我运行构建任务时,我想按以下顺序运行测试任务:单元测试(测试任务)、集成测试(intergationTest 任务)和验收测试(acceptanceTest 任务)。这可能吗?如何实现?

【问题讨论】:

    标签: gradle task automated-tests build-script


    【解决方案1】:

    您正在寻找 Gradle 文档 - http://www.gradle.org/docs/current/userguide/more_about_tasks.html中描述的“应该追随”

    【讨论】:

    • 正如我所见,它只指定了一个任务一个接一个地运行。我想在构建任务之前运行三个任务。我当然可以通过这个命令做到这一点,但这意味着如果我运行测试任务,只会再运行两个,我不希望这样。
    • 你试过了吗? taskY.shouldRunAfter taskX1, taskX2 有效。 gradle.org/docs/current/javadoc/org/gradle/api/…
    • 我知道这是可能的,但我希望只有在调用 build 时才会发生这种情况。
    • 我在 Gradle 官方论坛上问过同样的问题并得到了答案。你可以在这里看到它:forums.gradle.org/gradle/topics/…你的答案非常接近,所以我将它标记为有用。
    • 更新了 gradle 论坛讨论的链接:discuss.gradle.org/t/…
    【解决方案2】:

    在不创建人为依赖关系的情况下,您可以这样做:

    https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

    TLDR;版本:

    //--- build aliases : define a synonym here if you want a shortcut to run multiple targets
    
    def buildAliases = [
       'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'],
       'rebuild' : ['clean', 'assemble']
    ]
    def expandedTaskList = []
    
    gradle.startParameter.taskNames.each {
        expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
    }
    
    gradle.startParameter.taskNames = expandedTaskList.flatten()
    
    println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n"
    

    【讨论】:

      【解决方案3】:

      这就是我在项目中所做的。

      check.dependsOn integTest
      integTest.mustRunAfter test
      tasks.withType(Pmd) {
        mustRunAfter integTest // Pointing to a task
      }
      tasks.withType(FindBugs) {
        mustRunAfter tasks.withType(Pmd) // Pointing to a group of tasks under Pmd
      }
      tasks.withType(Checkstyle) {
        mustRunAfter tasks.withType(FindBugs)
      }
      

      它帮助我按组排序任务。

      【讨论】:

        【解决方案4】:

        我根据我在 Gradle 论坛上找到的解决方案创建了这个辅助方法。

        Task.metaClass.runFirst = { Task... others ->
            delegate.dependsOn(others)
            delegate.mustRunAfter(others[0])
            for (def i=0; i < others.size() - 1; i++) {
                def before = others[i]
                def after = others[i+1]
                after.mustRunAfter(before)
            }
        }
        

        然后你可以创建任务 X、A、B 和 C 并像这样使用:

        X.runFirst A, B, C
        

        【讨论】:

          【解决方案5】:

          列表中的第一个答案对我来说非常棒。我用过

          X.shouldRunAfter Y

          【讨论】:

          • 您好!欢迎来到 Stackoverflow 社区。只是建议:如果您想承认 Radim's answer 对您有用 - 最好对他的答案进行投票或在他的答案中发表评论。它会引起人们对您认为正确的答案的关注。无需为此目的提交单独的答案。
          猜你喜欢
          • 1970-01-01
          • 2016-11-18
          • 2012-05-06
          • 1970-01-01
          • 2014-07-13
          • 2018-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多