两个问题:
-
指定1个任务由其他几个任务组成的gradle方法是什么?
-
似乎gradle的
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中意味着两个不同的东西:dependsOn样式依赖和库样式依赖,因此很难搜索这个主题 .
2 回答
Gradle 's task model is 1869009 and doesn' t有一个聚合概念 . (重要的是要注意
TaskInternal#execute
是一个内部方法,不能从构建脚本中调用 . )聚合通常使用生命周期任务(具有任务依赖性但没有任何任务操作的任务)进行模拟:除
dependsOn
外,还支持以下任务关系:mustRunAfter
,_1866015_和finalizedBy
.通常,您不会调用
task.execute()
.您可以按以下方式指定一个任务由其他任务组成:
这输出:
请记住,运行依赖项任务的顺序并不总是有保证,但您可以通过specifying the order
task2.mustRunAfter task1
缓解此问题 . 通常,任务按照您期望的顺序运行 .另外,你应该阅读Gradle's Build Lifecycle . 使用语法
task task1 << {...}
时,您将指定在任务的执行阶段运行的闭包 . 在运行执行之前,配置阶段会评估构建脚本并确定要运行的任务以及按什么顺序运行 . 手动执行任务时,如:你绕过了Gradle评估task3的任务依赖性的能力,因此它只运行task3 .