如何在Android项目中结合复合构建与类型安全项目访问器?
问题:复合构建引入的模块无法通过类型安全项目访问器引用
我的Android应用模块结构如下:
app |> presentation (android module) |> domain (jvm module) |> androidkit (公司共享模块;通过Git子模块以复合构建方式引入)
原可正常运行的Gradle配置
settings.gradle.kts
include( ":app", ":presentation", ":domain", ) // 以复合构建方式引入androidkit includeBuild("androidkit")
app模块的build.gradle.kts
dependencies { implementation(project(":domain")) implementation(project(":presentation")) implementation("androidkit") ... }
使用类型安全项目访问器后的问题
启用Gradle的TYPESAFE_PROJECT_ACCESSORS特性后,projects.domain和projects.presentation可以正常引用,但复合构建引入的androidkit无法编译通过,配置代码如下:
settings.gradle.kts
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
app模块的build.gradle.kts
dependencies { implementation(projects.domain) implementation(projects.presentation) implementation(projects.androidkit) // 此处编译失败 }
解决方案
类型安全项目访问器仅为当前构建中通过include()声明的项目生成访问代码,复合构建引入的androidkit属于独立的外部构建,不在当前构建的项目集合内,因此无法通过projects.androidkit直接引用。可以通过以下两种方式解决:
- 方式一:使用模块的完整依赖坐标
如果androidkit已发布到内部或公共仓库,直接使用它的完整Maven坐标引用,例如:
dependencies { implementation(projects.domain) implementation(projects.presentation) implementation("com.yourcompany:androidkit:1.0.0") }
- 方式二:保留复合构建+依赖替换
如果需要继续使用本地复合构建的androidkit,可以在settings.gradle.kts中配置依赖替换规则,将坐标引用替换为本地复合构建的模块:
在settings.gradle.kts中添加:
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") includeBuild("androidkit") { dependencySubstitution { // 替换规则:将坐标com.yourcompany:androidkit替换为复合构建中的:androidkit项目 substitute(module("com.yourcompany:androidkit")).using(project(":androidkit")) } }
然后在app模块的依赖中使用坐标引用,Gradle会自动替换为本地复合构建的模块:
dependencies { implementation(projects.domain) implementation(projects.presentation) implementation("com.yourcompany:androidkit") }
内容的提问来源于stack exchange,提问作者m.reiter
相关产品推荐
相关产品推荐

