两个问题:
taskName.execute()
方法不尊重taskName
的dependsOn关系,这是真的吗?什么是解决方法?更多背景资料:
现在我有一个没有插件的构建脚本(换句话说不是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中意味着两个不同的东西:依赖于样式依赖和库样式依赖,因此很难搜索这个主题。
答案 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
外,还支持以下任务关系:mustRunAfter
,shouldRunAfter
和finalizedBy
。