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
相关产品推荐
相关产品推荐

