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_module2
和 1st_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
将为 project1
、1st_lvl_module1
和 1st_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
每个项目和模块。
此解决方案还可以针对多个任务进行扩展。
配置:
我有这样的多项目限制
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_module2
和 1st_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
将为 project1
、1st_lvl_module1
和 1st_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
每个项目和模块。
此解决方案还可以针对多个任务进行扩展。