如何调整模块依赖后用 graphUpdate 任务更新 nowinandroid 的模块依赖图?
【免费下载链接】nowinandroidA fully functional Android app built entirely with Kotlin and Jetpack Compose项目地址: https://gitcode.com/GitHub_Trending/no/nowinandroid
在 nowinandroid(Now in Android)仓库中,每个模块都有自己的README.md,其中包含该模块的 Mermaid 依赖图。当你调整了某个模块的 Gradle 依赖后,这张图就与代码不同步了。仓库提供了graphUpdate这个 Gradle 任务,用于把最新的依赖关系重新写入各模块README.md中的依赖图区块。本文说明如何在本地手动执行这个任务,并验证更新结果。
graphUpdate 任务如何工作
依赖图并不是手写维护的,而是由构建逻辑生成的。任务的注册与实现位于 Graph.kt,整体分两步:
graphDump任务:递归收集模块间的 ProjectDependency,把结果转成 Mermaid 文本,写到该模块的build/mermaid/graph.txt(图本体)和build/mermaid/legend.txt(图例)。graphUpdate任务:读取上一步的输出,用正则匹配各模块README.md中的<!--region graph--> ... <!--endregion-->区块,把区块内容整体替换为新的 Mermaid 图;如果模块还没有README.md,会按模板新建一个,模板里包含#模块路径``、## Module dependency graph标题和空的<!--region graph-->区块。
图里的线型按依赖配置区分:api配置用实线-->,implementation用虚线-.->,其他配置(如baselineProfile、testedApks)会带标签的虚线。docs/ModularizationLearningJourney.md 也说明了这一点:
When modules dependencies change, module graphs are automatically updated by the Build.yaml workflow. You can also manually update the graphs by running the
graphUpdatetask.
另外,这些任务是在根项目的 RootPlugin.kt 中为所有子项目注册的,且仅在没有启用 isolated projects 时生效;没有 build 文件的模块会被跳过。
准备工作
- 已获取 nowinandroid 仓库代码,并且当前工作区没有未处理的其他改动(避免后续
git diff时混淆来源)。 - 已调整好模块依赖,例如修改了某个
build.gradle.kts中的api/implementation声明。 - CI 侧使用的构建环境是 JDK 21(Zulu 21),见 Build.yaml 中的
Set up JDK 21步骤;本地执行./gradlew时使用项目自带的 Gradle Wrapper 即可。
执行 graphUpdate
在仓库根目录运行:
./gradlew graphUpdate该任务会对所有子项目执行:graphDump生成 Mermaid 文本,graphUpdate把文本写回对应模块的README.md。任务的副作用就是修改工作区中的**/README.md文件——这正是任务的设计用途,不需要额外参数。
如果你只想预览某模块生成的 Mermaid 内容而不改文件,可以直接运行graphDump,任务会输出生成的graph.txt路径到日志(logger.lifecycle打印build/mermaid/graph.txt的 URI)。
验证更新结果
检查 README.md 的变更
graphUpdate只替换<!--region graph-->与<!--endregion-->之间的内容,区块外的文字不受影响。用 git 查看被改动的文件:
git status -- "**/README.md" git diff -- "**/README.md"以:app模块 为例,更新后的区块形如(节选):
对照你修改的依赖声明,确认新增的线(如:app -.-> :some:module)已出现在图中。
用 CI 同款命令判断图是否已同步
Build.yaml 工作流中的 "Check Graphs" 步骤用下面的方式验证:先运行./gradlew graphUpdate,再执行
git add -- "**/README.md" && git diff --cached --quiet --exit-code -- "**/README.md"如果在本地已经跑过graphUpdate,再次执行该命令时git diff --cached --quiet不会有输出且以 0 退出,说明依赖图与代码一致。CI 中该检查失败时,fork 提交的 PR 会收到错误信息:
Check Graphs failed, please update graphs with: ./gradlew graphUpdate也就是说,CI 无法替 fork 自动更新图,需要你在本地运行./gradlew graphUpdate后把README.md的改动提交进去。
可选:定制图的范围
Graph.kt 支持两个 Gradle 属性来影响图的生成:
# 逗号分隔的模块路径列表,这些模块会从图中排除 graph.ignoredProjects=:some:module,:other # 逗号分隔的配置名,只有这些配置中的依赖会画进图里 graph.supportedConfigurations=api,implementation,baselineProfile,testedApksgraph.supportedConfigurations未设置时的默认值就是api,implementation,baselineProfile,testedApks,graph.ignoredProjects默认不排除任何模块。属性可以在gradle.properties或命令行(-Pgraph.ignoredProjects=...)中提供,改完后再运行./gradlew graphUpdate即可看到变化。
限制与注意点
graphUpdate的产物是每个模块README.md里的图区块,区块标记<!--region graph-->/<!--endregion-->被手工删除或改名后,任务无法定位替换位置,需要恢复这两个标记。graphDump在 Gradle 配置阶段就会递归收集依赖关系;实现注释也提到该收集是递归执行、不复用中间值的,但注释说明对每个项目一般耗时不到 1 ms。- 在 CI 中,"Update Graphs" 步骤带
continue-on-error: true,真正的失败判据是后续 "Check Graphs" 的 git diff 检查;仓库自身 PR 的图更新会由工作流自动提交(commit message 为🤖 Updates graphs),fork 的 PR 则必须自行提交图更新。
确认git diff --cached --quiet检查通过、README.md中的图与修改后的依赖声明一致后,就可以把**/README.md的改动随功能改动一起提交了。
【免费下载链接】nowinandroidA fully functional Android app built entirely with Kotlin and Jetpack Compose项目地址: https://gitcode.com/GitHub_Trending/no/nowinandroid
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考