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

标签 gradle

两个问题:

  1. 指定 1 个任务由多个其他任务组成的 gradle 方法是什么?
  2. 似乎 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/

相关文章:

android - react 本地android list 合并失败

java - 如何使用 Gradle 命令行设置 Java 系统属性?

android - TWA - 数字 Assets 链接正常,但地址栏仍然可见

gradle - Firebase admin sdk 对 gradle 的依赖导致启动层错误

gradle - 如何在gradle任务中设置ext属性,以及如何在任务和子项目中使用它

Android Studio 和 Gradle

java - gradle守护进程的高内存使用率

android - 是否可以在 android.defaultConfig 中为 versionCod` 设置 'String' 占位符?

java - 比较Jhipster中的两个集合

gradle - 在 Gradle Exec Task 中,命令行搜索环境但不是可执行文件的工作目录