如何优雅地为多模块Android项目批量生成模块依赖图?
批量生成多模块依赖图的Gradle任务实现
针对你的NowInAndroid多模块项目,你可以在根项目的构建脚本中添加一个自定义聚合任务,自动为所有模块生成依赖图,完全适配CI环境执行:
Kotlin DSL(build.gradle.kts)实现
tasks.register("generateAllModuleDependencyGraphs") { description = "Generate dependency graph for every module in the project" group = "Module Graph" // 收集所有子模块的路径(排除根项目) val modulePaths = project.subprojects.map { it.path } modulePaths.forEach { modulePath -> // 生成无冲突的输出文件名,比如将`:feature:search`转为`feature_search_dependency_graph.gv` val outputFileName = modulePath.removePrefix(":").replace(":", "_") + "_dependency_graph.gv" val outputFile = file(outputFileName) // 为当前模块创建并配置依赖图生成任务 val generateTask = tasks.named("generateModulesGraphvizText", Exec::class.java) { args = listOf( "-Pmodules.graph.output.gv=${outputFile.absolutePath}", "-Pmodules.graph.of.module=$modulePath" ) } // 将当前模块的生成任务加入聚合任务的依赖 dependsOn(generateTask) } }
Groovy DSL(build.gradle)实现
如果项目仍使用Groovy构建脚本,对应代码如下:
tasks.register('generateAllModuleDependencyGraphs') { description = 'Generate dependency graph for every module in the project' group = 'Module Graph' // 收集所有子模块的路径 def modulePaths = project.subprojects.collect { it.path } modulePaths.each { modulePath -> def outputFileName = modulePath.substring(1).replace(':', '_') + '_dependency_graph.gv' def outputFile = file(outputFileName) def generateTask = tasks.named('generateModulesGraphvizText', Exec) { args = [ "-Pmodules.graph.output.gv=${outputFile.absolutePath}", "-Pmodules.graph.of.module=$modulePath" ] } dependsOn(generateTask) } }
核心优势
- 自动遍历模块:无需手动维护模块列表,
subprojects会自动获取所有子模块 - 无冲突命名:将模块路径转换为合法文件名,避免不同模块的输出文件覆盖
- CI友好:只需调用单个任务
generateAllModuleDependencyGraphs即可完成批量生成,无需额外shell脚本处理 - 复用现有插件:直接基于Module Graph Assert插件的能力,无需额外开发
使用方法
在终端或CI流水线中执行以下命令:
./gradlew generateAllModuleDependencyGraphs
生成的.gv文件会保存在项目根目录,每个模块对应一个独立文件。
内容的提问来源于stack exchange,提问作者donturner
相关产品推荐
相关产品推荐

