了解Gradle任务依赖关系(dependsOn)

两个问题:

  1. 指定1个任务由多个其他任务组成的gradle方法是什么?
  2. 看起来像gradle的taskName.execute()方法不尊重任务的dependsOn关系是真实的,什么是解决方法?

更多背景:

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

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

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

我可以说:

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

但是task3本身依赖于taskSetup,而不运行taskSetup。 换句话说,execute()调用似乎并不尊重gradle的依赖关系parsing策略。

最后一个小抱怨(顺便说一下,我真的很喜欢gradle),因为依赖意味着在gradle中有两个不同的东西,所以很难在这个主题上进行search:dependsOn样式依赖关系和库样式依赖关系。

Gradle的任务模型是“平坦的”,没有聚合的概念。 (重要的是要注意, TaskInternal#execute是一个内部方法,不能从构build脚本中调用。)聚合通常用生命周期任务 (具有任务依赖关系但没有任何任务操作的任务)进行模拟:

 task allTests { dependsOn tasks.withType(Test) } 

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

通常,您不要调用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 

请记住,运行依赖性任务的顺序并不总能得到保证,但是您可以通过指定 task2.mustRunAfter task1 命令来缓解这种情况。 通常情况下,这些任务按您期望的顺序运行。

另外,您应该阅读Gradle的构build生命周期 。 当您使用语法task task1 << {...} ,您将指定在任务的执行阶段中运行的闭包。 在执行运行之前,configuration阶段会评估您的构build脚本,并确定要运行的任务以及以何种顺序。 当您手动执行任务时,如下所示:

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

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