Gradle仅加载settings.gradle中include的模块,未include的模块完全不解析其build.gradle;应精简include列表、动态条件include、避免subprojects全局配置、用gradle.properties控制开关,并确保无关目录不被识别为模块。

直接结论:不被 include 的模块,Gradle 根本不会加载它的 build.gradle,更不会执行任何配置逻辑——所以“减少无关模块配置”的核心,就是让 Gradle 别看见它。
settings.gradle 里只 include 真正要参与构建的模块
很多人把所有子目录都写进 include,比如:include ':app', ':core', ':network', ':storage', ':analytics', ':mock',但实际每次构建只用到前四个。那个 :mock 是测试用的模拟模块,CI 流水线从不构建它,本地开发也只在调试时临时启用。
这种写法会导致 Gradle 在配置阶段(configuration phase)强制加载 :mock/build.gradle,解析其中的插件、依赖、tasks——哪怕你最终只运行 ./gradlew :app:assembleDebug。
- 删掉不用的
include是最轻量、最有效的“减配”手段 - 如果某些模块是条件性启用(如内部工具模块),可以用 Kotlin DSL 的 if 判断动态 include:
if (System.getenv("ENABLE_TOOLS") == "true") include(":tools") - 注意:
include路径必须和目录名严格一致,大小写、冒号、斜杠都不能错;否则 Gradle 会静默忽略,但你在 IDE 里可能看到模块“灰掉”或同步失败
根项目的 build.gradle 中避免 subprojects {} 全局污染
常见错误是用 subprojects 块统一 apply 插件或配置仓库,比如:
subprojects {
apply plugin: 'java'
repositories { mavenCentral() }
dependencies { testImplementation 'junit:junit:4.13.2' }
}
问题在于:只要模块被 include 进来,不管它是不是 Java 模块(比如一个纯 Kotlin DSL 脚本模块、一个 Gradle plugin 模块、甚至一个空目录),都会强制执行这段逻辑,可能报错或拖慢配置速度。
- 改用
configure(subprojects - [project(':plugin')])显式排除不需要的模块 - 更推荐的方式是按需配置:在每个子模块自己的
build.gradle里声明所需插件,而不是靠父项目“推过去” - 如果真要统一管理,优先用
allprojects(只影响有build.gradle的工程),并加 guard:if (plugins.hasPlugin('java')) { ... }
用 gradle.properties 控制模块开关,而不是硬编码 include
当模块启停频繁(比如 A/B 测试模块、客户定制模块),每次改 settings.gradle 提交代码太重。可以改用属性驱动:
- 在
gradle.properties加一行:enable.feature.pay=true - 在
settings.gradle.kts里读取:if (findProperty("enable.feature.pay") == "true") include(":feature-pay") - 这样 CI 可以通过
-Penable.feature.pay=false快速跳过该模块,本地也能用不同参数组合验证构建范围 - 注意:
findProperty返回的是String?,不能直接用== true,必须比字符串值
模块目录存在但不想被识别?加 .gradleignore 或重命名
有些目录只是放脚本、文档或历史备份(如 legacy-api/、scripts/),但因为名字带 - 或 .,IDE 或 Gradle 有时会误判为模块。Gradle 本身不支持 .gradleignore,但有两个实操办法:
- 把目录重命名为
_legacy-api或scripts_—— Gradle 默认只识别以字母开头、不含下划线前缀的目录名作为模块候选 - 在
settings.gradle开头加一段“黑名单过滤”:gradle.startParameter.projectProperties.get("ignoredModules")?.split(",")?.forEach { exclude(it) },再配合命令行传参 - 最彻底的办法:确认该目录下没有
build.gradle,且没被任何include语句覆盖——Gradle 就真的完全无视它
真正容易被忽略的点是:**模块是否被加载,只取决于 settings.gradle 的 include 列表和目录结构,跟 build.gradle 文件是否存在、内容是否合法,完全无关。** 很多人花时间 debug 子模块里的语法错误,却没意识到——只要它没被 include,那错误压根不会触发。











