KMP项目中wasmJsMain构建时SQLDelight依赖解析失败求助
问题描述
我正在开发一个面向Android、iOS、Desktop和JS平台的KMP项目,按照官方文档集成了SQLDelight作为ORM。在Common模块的build.gradle中,我添加了插件并配置了数据库:
plugins { id("app.cash.sqldelight") version "2.0.2" } sqldelight { databases { create("Database") { packageName.set("ir.dorantech.kmp.data.database") } } }
但构建项目时遇到了以下错误:
:composeApp:wasmJsMain: Could not resolve app.cash.sqldelight:runtime:2.0.2. Required by: project :composeApp Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
我尝试寻找JS平台的解决方案,更新了配置如下:
sqldelight { databases { create("Database") { packageName.set("ir.dorantech.kmp.data.database") generateAsync.set(true) } } }
但问题仍然没有解决,有没有人遇到过KMP项目中JS(WasmJS)目标使用SQLDelight的这个问题?求建议或解决方案。
解决方案
你好,我之前在KMP项目中处理WasmJS目标的SQLDelight依赖时也遇到过类似问题,这里给你几个可行的解决步骤:
1. 确保全局仓库配置正确
首先,SQLDelight的所有稳定版依赖都托管在Maven Central上,你需要在**项目根目录的settings.gradle.kts**中统一配置仓库,避免模块级仓库配置遗漏:
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
不要仅在模块的build.gradle中配置仓库,全局配置能保证所有平台目标(包括WasmJS)都能访问到依赖源。
2. 为WasmJS目标添加专属驱动依赖
WasmJS与普通JS的SQLDelight驱动不同,你需要在模块的build.gradle.kts中为wasmJsMain源码集单独添加Wasm专属的驱动和异步依赖(因为你开启了generateAsync.set(true)):
kotlin { sourceSets { val commonMain by getting { dependencies { // Common模块引入基础SQLDelight runtime implementation("app.cash.sqldelight:runtime:2.0.2") } } val wasmJsMain by getting { dependencies { // WasmJS专属的SQLite驱动 implementation("app.cash.sqldelight:sqlite-wasm-driver:2.0.2") // 异步生成对应的runtime依赖 implementation("app.cash.sqldelight:async-runtime:2.0.2") } } } }
这是导致Gradle无法解析的核心原因:你之前仅修改了SQLDelight的代码生成配置,但未添加Wasm平台所需的具体依赖。
3. 清理Gradle缓存并重新构建
有时候Gradle的本地缓存会导致依赖解析异常,执行以下命令强制刷新依赖并清理缓存:
./gradlew clean build --refresh-dependencies
4. 可选:升级SQLDelight版本
如果以上步骤仍未解决问题,可以尝试将SQLDelight升级到更近期的稳定版(如2.1.1),新版本对WasmJS的兼容性更好,配置也更简洁。
按照这些步骤操作后,WasmJS目标的SQLDelight依赖解析问题应该就能解决了。
备注:内容来源于stack exchange,提问作者Ali Doran

