Gradle复合构建中同名子项目冲突问题及解决咨询
解决Gradle复合构建中同名模块冲突的问题
核心解决方案:给纳入的构建添加模块前缀
Gradle 7.1及以上版本支持直接为纳入的复合构建指定modulePrefix,自动给该构建下所有模块名称添加前缀,彻底解决同名冲突。修改app/settings.gradle.kt如下:
includeBuild("../audio") { modulePrefix = "audio" } includeBuild("../video") { modulePrefix = "video" }
配置后,原audio/lib模块的路径会变为:audio:lib,video/lib变为:video:lib,两者不再冲突。后续在app项目中依赖时,直接使用带前缀的模块名即可,比如:
implementation(project(":audio:lib")) implementation(project(":video:lib"))
替代方案:手动映射模块别名(适用于旧版Gradle)
如果使用Gradle 7.1以下版本,可通过dependencySubstitution手动将同名模块映射为不同别名:
- 先修改其中一个子项目的模块名称,比如在
audio/settings.gradle.kt中,将原include(":lib")改为:
include(":audio-lib") project(":audio-lib").projectDir = file("lib")
- 然后在
app/settings.gradle.kt中配置依赖替换:
includeBuild("../audio") { dependencySubstitution { substitute(module(":lib")).using(project(":audio-lib")) } } includeBuild("../video") // 保留原:lib模块
这样app项目中可分别依赖:audio-lib和:lib(对应video的模块)。
补充方案:修改子项目发布名称
如果不想改动复合构建配置,也可以直接修改子项目的构件名称避免依赖混淆。比如在audio/lib/build.gradle.kt中添加:
archivesBaseName = "audio-lib"
但这种方法仅改变构件名称,模块路径仍为:lib,无法解决复合构建中的路径冲突,仅作为补充使用。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

