两个问题:
- 指定 1 个任务由多个其他任务组成的 gradle 方法是什么?
- 似乎 gradle 的
taskName.execute()
方法不尊重taskName
的 dependentOn 关系,这是真的吗?解决方法是什么?
更多背景:
现在我有一个没有插件的构建脚本(换句话说不是Java)。我想要一个名为 tests
的任务来运行我的所有测试任务。我有3个这样的任务。将它们称为任务 1、任务 2 和任务 3。
我可以说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 中意味着两种不同的东西:dependsOn 风格依赖关系和库风格依赖关系。
最佳答案
通常,您不会调用 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 评估任务 3 的任务依赖性的能力,因此它仅运行任务 3。
关于gradle - 了解 Gradle 任务依赖关系 (dependsOn),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21612729/