了解Gradle任务依赖关系(dependsOn)
两个问题:
- 指定1个任务由多个其他任务组成的gradle方法是什么?
- 看起来像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
之外,还支持以下任务关系: mustRunAfter
, shouldRunAfter
和finalizedBy
。
通常,您不要调用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。
- 如何使用Android Studio获取代码覆盖率?
- Gradle代理configuration
- 在哪里把Gradleconfiguration(即凭据)不应该提交?
- 当构buildandroid -gradle项目时crashlytics开发人员工具错误
- Android Studio中的Gradle是什么?
- “Gradle版本2.10是必需的。”错误
- Android构buildgradle太慢(依赖分辨率)
- 无法在圈子ci中findcom.android.tools.build:gradle:3.0.0-alpha1
- Android Studio Gradle问题:OutOfMemoryError:PermGen空间