了解Gradle任务依赖性(dependsOn)

时间:2014-02-06 19:57:05

标签: gradle

两个问题:

  1. 指定1个任务由其他几个任务组成的gradle方法是什么?
  2. 似乎gradle的taskName.execute()方法不尊重taskName的dependsOn关系,这是真的吗?什么是解决方法?
  3. 更多背景资料:

    现在我有一个没有插件的构建脚本(换句话说不是Java)。我想要一个名为tests的任务,它将运行我的所有测试任务。我有3个这样的任务。称他们为task1,task2和task3。

    我可以说tests.dependsOn ['task1', 'task2', 'task3']

    这有点不稳定,因为这种关系似乎是tests.isComprisedOf ['task1', 'task2', 'task3']

    我可以说:

    task tests << {
        task1.execute()
        task2.execute()
        task3.execute()
    }
    

    但是task3本身依赖于taskSetup,它运行时没有运行taskSetup。换句话说,execute()调用似乎不尊重gradle的依赖关系解析策略。

    最后一个小抱怨(我确实喜欢gradle),是因为依赖在gradle中意味着两个不同的东西:依赖于样式依赖和库样式依赖,因此很难搜索这个主题。

2 个答案:

答案 0 :(得分:51)

通常,您不会调用task.execute()

您可以通过以下方式指定一个任务由其他任务组成:

task task1 << {
   println "Hello"
}

task task2 << {
   println "World"
}

task task3(dependsOn: 'task3dependency') << {
   println "QBert"
}

task task3dependency << {
   println "MR"
}

task tests(dependsOn: ['task1', 'task2', 'task3'])

输出:

$ gradle tests
:task1
Hello
:task2
World
:task3dependency
MR
:task3
QBert
:tests

BUILD SUCCESSFUL

请注意,运行依赖项任务的顺序并不总能得到保证,但您可以通过specifying the order task2.mustRunAfter task1来缓解此问题。通常,任务按照您期望的顺序运行。

另外,您应该阅读Gradle's Build Lifecycle。使用语法task task1 << {...}时,您将指定在任务的执行阶段运行的闭包。在运行执行之前,配置阶段会评估构建脚本并确定要运行的任务以及按什么顺序运行。手动执行任务时,如:

task tests << {
    task1.execute()
    task2.execute()
    task3.execute()
}

您绕过了Gradle评估task3的任务依赖关系的能力,因此它只运行 任务3。

答案 1 :(得分:37)

Gradle的任务模型是&#34; flat&#34;并没有聚合的概念。 (重要的是要注意TaskInternal#execute是一种内部方法,不能从构建脚本中调用。)聚合通常使用生命周期任务进行模拟(任务包含任务)依赖,但没有任何任务操作):

task allTests {
    dependsOn tasks.withType(Test)
}

dependsOn外,还支持以下任务关系:mustRunAftershouldRunAfterfinalizedBy