Gradle 依赖项的多项目递归任务

Gradle multi project recursive task for dependencies

配置:

我有这样的多项目限制

project1:
  implementation(1st_lvl_module1)
  implementation(1st_lvl_module2)
project2:
  implementation(1st_lvl_module1)
  implementation(1st_lvl_module2)
  implementation(1st_lvl_module3)
project3:
  implementation(1st_lvl_module2)

1st_lvl_module1:
  implementation(2nd_lvl_module1)
  implementation(2nd_lvl_module2)
1st_lvl_module2:
  implementation(2nd_lvl_module2)
1st_lvl_module3:
  implementation(2nd_lvl_module2)
  implementation(2nd_lvl_module3)

2nd_lvl_module1
2nd_lvl_module2
2nd_lvl_module3

问题:

我想为所有项目执行一些任务(例如 gradle test)。它按顶级调用的要求工作。但是我想为每个项目独立执行它,这里我遇到了问题。

如果我确实调用了 gradle project1:test,它将仅针对 project1 执行,并且不包括 1st_lvl_module1,后者还实现了 2nd_lvl_module1 and 2nd_lvl_module21st_lvl_module2 2nd_lvl_module2


tasks.register("testWithDependencies") { task ->
        task.dependsOn("test")
        configurations.forEach {
            it.dependencies.findAll { it instanceof ProjectDependency }.forEach {
                dependsOn ":${it.name}:test"
            }
        }
    }

通过这种方式,它也适用于第一级实现。 gradle project1:testWithDependencies 将为 project11st_lvl_module11st_lvl_module2 执行 test 任务,但仍然忽略 2nd_lvl_module1 2nd_lvl_module2

tasks.register("pd") { task ->
    configurations.forEach {
        println("Config name: ${it.name}")
        it.dependencies.findAll { it instanceof ProjectDependency }.forEach {
            def depProject = ((ProjectDependency)it).getDependencyProject()
            println("${depProject.name}")
            depProject.configurations.forEach {
                println("---Config name: ${it.name}")
            }
        }
    }
}

我的 project1 包含 implementation 配置,但所有 1st_lvl_module* 都没有。实际上 configurations 子模块列表看起来很差。


问题:

有人对多模块子项目结构有同样的问题吗?或者可能存在最简单的递归调用方法?

解决方法: 文件例如。 testWithDependency.gradle 内容如下:

tasks.register("testWithDependencies") { task ->
        task.dependsOn("test")
        configurations.forEach {
            it.dependencies.findAll { it instanceof ProjectDependency }.forEach {
                dependsOn ":${it.name}:testWithDependencies"
            }
        }
    }

应在最后应用 (当项目的依赖项将被验证时) of gradle.build 每个项目和模块。

此解决方案还可以针对多个任务进行扩展。