如何在所有子项目中调用Gradle任务?

时间:2020-04-09 23:09:36

标签: java gradle

说,我有一个Gradle项目的层次结构,其中一些应用了java插件:

root
  projA
    projA1
    projA2 (java)
  projB
    projB1 (java)
    projB2 
      projB21 (java)
      projB22 (java) 
  projC (java)

我想在存在该任务的所有子项目中执行test任务::projA:projA2:test:projB:projB1:test:projC:test。将来可能会添加更多项目,并且我不想手动支持所有子项目中所有测试任务的列表。我该如何实现?

我想到的一件事类似于以下内容:

// In root I iterate over all subprojects and find the task by name causing
// its creation and configuration

tasks.register("testAll") {
  dependsOn subprojects.findResults { it.tasks.findByName("test") }
}

我不喜欢这种方法,因为它违背了task configuration avoidance风格。

另一种选择是遍历子项目并检查java插件是否应用于该子项目:

// In root

tasks.register("testAll") {
  dependsOn subprojects.findAll { it.plugins.hasPlugin("java") }.collect { it.tasks.named("test") }
}

它可以工作,但是我有一种想念更简单的东西...

编辑1 :很抱歉,但是我忘记了一个重要的细节-我需要在项目的子树中运行测试。说,:projB后面的所有内容。

1 个答案:

答案 0 :(得分:2)

除非我缺少任何内容,否则您要为所有子模块运行测试。

您可以...做到这一点。

./gradlew clean test

这将在所有配置充分的子项目中运行测试任务。

如果需要在特定子项目中运行任务,请从根项目中指定要运行任务的子项目。

./gradlew clean :projB:test

如果子项目的任务需要在 测试后运行,则可以在subprojects块中执行此操作。

subprojects {
    myTask.dependsOn("test")
}