KMM项目自定义Snapshot构建类型时SQLDelight Android驱动匹配失败
KMM自定义构建类型"snapshot"集成SQLDelight时的构建错误解决
问题现象
在集成SQLDelight的KMM项目中,使用自定义构建类型snapshot时出现构建失败:debug构建可正常运行,但snapshot构建抛出依赖解析错误,无法找到app.cash.sqldelight:android-driver:2.0.0的匹配变体。
错误信息
Could not resolve all files for configuration ':android:app:snapshotRuntimeClasspath'. Could not resolve app.cash.sqldelight:android-driver:2.0.0. Required by: project :android:app project :android:app > project :kmp:shared > project :kmp:core-db > No matching variant of app.cash.sqldelight:android-driver:2.0.0 was found.
当前KMM源码集配置
kotlin { sourceSets { commonMain.dependencies { implementation(project(":kmp:core")) implementation(project(":kmp:core-api")) implementation(libs.sqldelight.runtime) implementation(libs.korlibs.klock) api(libs.sqldelight.flow.ext) api(libs.sqldelight.primitive.adapters) } androidMain.dependencies { implementation(libs.sqldelight.android.driver) } iosMain.dependencies { implementation(libs.sqldelight.native.driver) } } }
已尝试但无效的方案
buildTypes { getByName("snapshot"){ initWith(getByName("release")) matchingFallbacks.addAll(listOf("debug, release")) } }
解决方法
1. 修正KMM模块的Android构建类型配置
在KMM共享模块的build.gradle.kts中,为kotlin.android块添加自定义构建类型的配置,明确声明要发布的变体并设置匹配回退:
kotlin { android { // 声明需要发布的构建变体,包含自定义的snapshot publishLibraryVariants("release", "debug", "snapshot") buildTypes { getByName("snapshot") { initWith(getByName("release")) // 指定当找不到snapshot变体时,回退使用release变体 matchingFallbacks.add("release") } } } // 保留原有的sourceSets配置 sourceSets { // ... 原内容不变 } }
2. 修正App模块的matchingFallbacks格式
之前的代码中listOf("debug, release")是错误的字符串格式,需要拆分为两个独立的字符串:
buildTypes { getByName("snapshot") { initWith(getByName("release")) matchingFallbacks.addAll(listOf("debug", "release")) } }
3. 强制依赖解析使用指定变体(可选)
如果上述方法仍无效,可以在App模块的build.gradle.kts中添加配置,强制SQLDelight依赖使用release变体:
configurations.all { if (name.contains("snapshot")) { resolutionStrategy { eachDependency { if (requested.group == "app.cash.sqldelight" && requested.name == "android-driver") { useVariant("release") } } } } }
原因说明
自定义构建类型snapshot没有对应的第三方库变体,Gradle无法自动匹配。通过配置matchingFallbacks,可以告诉Gradle在找不到自定义变体时,使用标准的release/debug变体替代。同时KMM共享模块需要明确声明要发布的变体,否则不会为自定义构建类型生成对应的依赖配置。
内容的提问来源于stack exchange,提问作者Suraj Giri
相关产品推荐
相关产品推荐

