gradle projects是最直接查看模块树结构的方式,它递归列出所有被settings.gradle显式include的子项目及其缩进层级,漏写include则模块不会出现,路径必须与磁盘目录名严格一致(区分大小写、冒号分隔)。

用 gradle projects 查看模块树结构
这是最直接的方式,Gradle 自带的 projects 任务会递归列出所有子项目及其层级关系,包括根项目和嵌套的子模块。
在项目根目录下运行:
gradle projects
输出中每个 :submodule-name 行代表一个子模块,缩进表示嵌套深度。注意:只有被 include 进 settings.gradle(或 settings.gradle.kts)的目录才算有效子模块,漏写 include 就不会出现在列表里。
- 如果用 Kotlin DSL,确认
settings.gradle.kts中调用了include("module-a", "lib:core"),路径分隔符是冒号:,不是斜杠 - Windows 下若提示
gradle: command not found,优先用./gradlew projects(Linux/macOS)或gradlew.bat projects(Windows) - 输出里带
[buildscript]的模块是仅用于构建脚本的独立项目,通常可忽略
用 gradle :help --scan 或 --dry-run 辅助验证
当 projects 输出不清晰(比如模块名太长、缩进混乱),可以换种方式交叉验证哪些模块“实际能被识别”。
执行:
gradle :help --dry-run
它不会真正执行任务,但会扫描所有已注册的项目,并在日志开头打印类似 Selected projects: [root, module-a, feature:ui] 的信息。这个列表比 projects 更扁平,适合快速核对名称拼写是否正确。
-
--dry-run不依赖子模块是否有build.gradle,只要settings.gradle里include了就会出现 - 如果某模块没出现在这里,八成是
settings.gradle路径写错了,比如写成include "app"但实际目录叫my-app -
--scan需要 Gradle Enterprise 插件,普通项目不用加,避免白等上传
检查 settings.gradle 是否漏掉 include
很多“找不到子模块”的问题根源不在命令,而在配置本身。Gradle 不会自动发现同级目录下的文件夹,必须显式声明。
打开 settings.gradle,确认每行 include 后面的字符串和磁盘目录名**完全一致**(区分大小写,不含多余空格):
include ':app', ':data', ':domain'
对应目录结构必须是:
project-root/ ├── app/ ├── data/ ├── domain/ └── settings.gradle
- 如果子模块在子目录下(如
modules/network/),include必须写成include ':modules:network',且目录路径也得是modules/network - Kotlin 版本中误写成
include("modules.network")(点号)会导致模块加载失败,必须用冒号: - 删掉某行
include后,该模块立刻从gradle projects输出中消失,哪怕目录还在
为什么 gradle tasks 不适合查子模块
gradle tasks 默认只显示当前项目的任务,除非你指定前缀,比如 gradle :app:tasks。它不提供模块拓扑视图,容易误判“哪些模块存在”。
更麻烦的是:如果某个子模块的 build.gradle 语法错误,gradle projects 仍能列出它(因为不加载 build 文件),但 gradle tasks 执行到那个模块时会直接报错中断,反而掩盖了真实模块列表。
- 想批量查看所有模块的任务?可以用
gradle -q projects | grep '^:' | cut -d' ' -f2 | xargs -I{} gradle {}:<code>tasks --all(Linux/macOS),但没必要——先理清模块结构更重要 - IDE(如 IntelliJ)有时会缓存旧的模块结构,改完
settings.gradle后记得点击 “Refresh project” 图标 - 多版本 Gradle 兼容性没问题,
projects从 2.x 到 8.x 行为一致,放心用
settings.gradle 的 include 和磁盘路径是否严丝合缝。命令只是照镜子,镜子里没有,说明镜子前面的东西本来就没摆好。











