You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:44:54