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

Compose Multiplatform配置iOS时SqlDelight依赖报错求助

问题:Compose Multiplatform iOS构建SqlDelight依赖错误

将原无iOS端的Jetpack Compose应用转为Compose Multiplatform项目,配置iOS共享模块时构建失败,出现以下错误:

Cannot access class 'app.cash.sqldelight.db.SqlSchema'. Check your module classpath for missing or conflicting dependencies
Unresolved reference: SqlDriver

项目配置代码

plugins {
    alias(libs.plugins.kotlin.multiplatform)
    alias(libs.plugins.android.library)
    alias(libs.plugins.sqldelight)
    alias(libs.plugins.compose)
    alias(libs.plugins.kotlin.serialization)
    alias(libs.plugins.kotlin.cocoapods)
    id("dev.icerock.mobile.multiplatform-resources")
}

android {
    namespace = "com.vboxcomm.cdapplication"
    compileSdk = 34
    defaultConfig {
        minSdk = 26
    }
}

dependencies {
    implementation(libs.firebase.database.ktx)
    commonMainApi(libs.bundles.moko.resources)
}

@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
kotlin {
    applyDefaultHierarchyTemplate()

    android {
        compilations.all {
            kotlinOptions {
                jvmTarget = "1.8"
            }
        }
    }

    val iOSBinaryFlags =
        listOf(
            "-linker-option", "-framework", "-linker-option", "Metal",
            "-linker-option", "-framework", "-linker-option", "CoreText",
            "-linker-option", "-framework", "-linker-option", "CoreGraphics",
        )

    // Targets
    iosX64 {
        binaries.forEach { it.freeCompilerArgs += iOSBinaryFlags }
    }
    iosArm64 {
        binaries.forEach { it.freeCompilerArgs += iOSBinaryFlags }
    }
    iosSimulatorArm64 {
        binaries.forEach { it.freeCompilerArgs += iOSBinaryFlags }
    }
//    tvosArm64()
//    tvosX64()

    version = "1.0"

    cocoapods {
        summary = "Some description for the Shared Module"
        homepage = "Link to the Shared Module homepage"
        version = "1.0"
        ios.deploymentTarget = "16.0"
        podfile = project.file("../apple/Podfile")

        framework {
            baseName = "shared"
            isStatic = false
            linkerOpts += "-lsqlite3"
            export(libs.moko.resource)
            export(libs.decompose.router)
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {

                implementation(libs.bundles.compose)
                api(compose.runtime)
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") {
                    version { strictly("1.7.3") }
                }

//                implementation(libs.coroutines.extensions)
                implementation(libs.multiplatform.settings)
                api(libs.koin.core)
                api(libs.koin.compose)

                implementation(libs.sqldelight.coroutines.extensions)
                implementation(libs.sqldelight.primitive.adapters)

                implementation(libs.stately.common)
                implementation(libs.ktor.network)
                implementation(libs.ktor.network.tls)
                implementation(libs.ktor.client.core)
                implementation(libs.ktor.client.cio)
                implementation(libs.ktor.client.websockets)
                implementation(libs.ktor.serialization.kotlinx.json)
                implementation(libs.ktor.client.serialization)
                implementation(libs.kotlinx.serialization.core)

                implementation(kotlin("stdlib-common"))
                implementation(libs.kermit)
                implementation("javax.servlet:javax.servlet-api:3.1.0")
                //implementation("javax.servlet:servlet-api:3.1.0")
                api("jakarta.servlet:jakarta.servlet-api:6.0.0")

                api(libs.decompose.router)

                api("io.github.kevinnzou:compose-webview-multiplatform:1.8.8")

                // You will probably need to also bring in decompose and essenty
                implementation(libs.decompose)
                implementation(libs.decompose.compose.multiplatform)
                implementation(libs.essenty.parcelable)
                implementation(libs.molecule.runtime)

                implementation("media.kamel:kamel-image:0.9.0")

                api(libs.permissions.compose)
            }
        }

        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }

        val androidMain by getting {
            dependsOn(commonMain)
            dependencies {
                implementation(kotlin("reflect"))
                implementation(libs.sqldelight.android.driver)

                implementation(libs.kotlinx.coroutines.android)
                implementation(libs.androidx.lifecycle.viewmodel.ktx)
                implementation(libs.timber)

            }
        }

        iosMain.dependencies {
            implementation(libs.sqldelight.native.driver)
            implementation(libs.ktor.client.darwin)
            api(compose.runtime)
        }

//        val iosX64Main by getting
//        val iosArm64Main by getting
//        val iosSimulatorArm64Main by getting
//        val tvosArm64Main by getting
//        val tvosX64Main by getting
    }
}

sqldelight {
    databases {
        create("CdApplicationDb") {
            packageName.set("com.vboxcomm.shared.database")
            dialect(libs.sqldelight.sqlite.dialect)
            schemaOutputDirectory.set(file("src/commonMain/sqldelight/com/vbox/shared/database"))
            verifyMigrations.set(true)
        }
    }
}

multiplatformResources {
    multiplatformResourcesPackage = "com.vboxcomm.cdapplication"
    multiplatformResourcesClassName = "SharedRes"
}

解决方案(针对SqlDelight 2.0.1版本)

1. 补充CommonMain的SqlDelight核心依赖

SqlSchema和SqlDriver的基础定义位于SqlDelight核心runtime库中,当前配置的commonMain缺少该依赖,需添加:

// 在commonMain的dependencies块中添加
implementation(libs.sqldelight.runtime)
// 若使用硬编码版本,对应2.0.1:
// implementation("app.cash.sqldelight:runtime:2.0.1")

2. 验证iOS驱动依赖的正确性

确保libs.sqldelight.native.driver指向正确的包坐标:app.cash.sqldelight:native-driver:2.0.1,检查项目根目录的libs.versions.toml文件,确认版本与SqlDelight插件版本一致。

3. 修正Schema生成路径

当前配置中schemaOutputDirectory的路径与packageName不匹配,会导致生成的Schema类无法被正确识别,修正路径:

schemaOutputDirectory.set(file("src/commonMain/sqldelight/com/vboxcomm/shared/database"))

4. 清理缓存并重新构建

执行以下步骤清除缓存并同步项目:

  • 运行Gradle任务:./gradlew clean
  • 在IDE中点击"Sync Project with Gradle Files"
  • 重新执行构建任务

5. 排查依赖冲突

运行./gradlew dependencies命令,查看commonMain和iosMain中SqlDelight相关依赖的版本是否统一,若存在不同版本的依赖,需强制统一为2.0.1版本。

内容的提问来源于stack exchange,提问作者Amit Laloush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:27:33