如何在Gradle根项目中向指定子项目应用闭包(排除特定项目)?
解决Gradle多项目中向部分子项目应用配置的问题
Groovy DSL 实现方式
方式1:通过条件过滤子项目
在subprojects闭包中添加判断逻辑,只对目标项目应用配置:
subprojects { // 排除:bar项目,对其余子项目生效 if (name != 'bar') { apply plugin: '你的插件ID' // 这里添加共享配置,比如依赖、版本等 group = 'com.example' version = '1.0.0' dependencies { implementation 'org.slf4j:slf4j-api:2.0.7' } } }
也可以精准指定需要配置的项目:
subprojects { if (name in ['foo1', 'foo2']) { apply plugin: '你的插件ID' // 共享配置内容 } }
方式2:定义自定义项目集合
先筛选出目标子项目,再统一应用闭包,代码可读性更强:
// 筛选所有名称以foo开头的子项目 def fooProjects = subprojects.findAll { it.name.startsWith('foo') } fooProjects.each { project -> project.apply plugin: '你的插件ID' project.with { // 共享配置 group = 'com.example' dependencies { testImplementation 'junit:junit:4.13.2' } } }
方式3:直接指定多个项目路径
Gradle支持通过project()方法传入多个项目路径,一次性配置:
project(':foo1', ':foo2') { apply plugin: '你的插件ID' // 共享配置内容 }
Kotlin DSL 实现方式
方式1:过滤子项目批量配置
subprojects.filter { it.name in setOf("foo1", "foo2") }.configureEach { plugins.apply("你的插件ID") // 共享配置 group = "com.example" version = "1.0.0" dependencies { implementation("org.slf4j:slf4j-api:2.0.7") } }
方式2:指定多个项目路径配置
projects(":foo1", ":foo2").configureEach { plugins.apply("你的插件ID") // 共享配置内容 }
注意事项
- 如果后续会新增同类型子项目(比如
:foo3),用名称前缀过滤的方式更灵活,无需修改配置; - 若需要精确控制目标范围,直接指定项目路径或名称列表的方式更可靠,避免误配置其他项目。
内容的提问来源于stack exchange,提问作者user16564904
相关产品推荐
相关产品推荐

