有没有一种更方便的方法来在Gradle中对任务进行排序而不是mustRunAfter?

时间:2015-03-20 01:28:01

标签: gradle

Gradle通常会确定任务顺序本身,这通常很好,但有时您需要任务排序。

根据the User Guideother discussion here,有两种基本的订购方式:

  • 使用依赖关系,即taskB依赖于taskA,因此taskA将首先执行。
  • 添加新的父任务,并使用mustRunAfter作为约束来对子任务进行排序。

然而,在某些情况下,这两种方法似乎都很麻烦。

示例1 : 在由某个连续构建系统运行的日常任务中,您可能有一个序列:

setupTask1 setupTask2 build test sendReport

现在,您可以通过在gradle命令行上传递这些任务来实际编写外部脚本,即

gradle setupTask1 setupTask2 build test sendReport

但是如果你想在构建文件本身(而不是外部)中编写(并记录)这个序列,你需要创建一个新任务,然后添加四个新的排序约束吗?

示例2 : 现在想象我们有

startServer1 startServer2 integrationTest tearDownServer2 tearDownServer1

在这种情况下,我们需要排序,但也要控制失败,因为如果integrationTest失败,您仍然希望拆除步骤发生。然后我们不仅需要mustRunAfter,我们还要添加finalizedBy。我们在integrationTest上添加终结器吗?如果我们添加更多需要这种线束的测试呢?如果我们想让tearDownServer1相对于tearDownServer2进行排序怎么办?

总之,测序看起来非常笨拙,至少对于Gradle新手来说。在某些情况下,仅仅以更迫切的方式直接对事物进行排序可能更为优雅。我错过了什么吗?这里有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

建议(高度)使用(已命名的)解决方案来使用dependsOnmustRunAfter

如果您可以调用任务而不是依赖任务,那么您可以尝试以下可能的 示例一 解决方案。创建一个按顺序执行任务的任务。你会得到这样的东西:

task dailyCIJob << {
    [setupTask1, setupTask2, build, test, sendReport].each {
        it.execute()
    }
}

示例二 的解决方案有两个,两个都不令人满意:

  1. 使用--continue Gradle commanline参数。如果任务失败,这将使Gradle继续。
  2. seem也可以为每个(测试)任务设置ignoreFailures布尔属性。