KMM:sqldelight:coroutines-extensions 将 kotlinx-coroutines-core 版本设置为 1.3.9
KMM: sqldelight:coroutines-extensions sets kotlinx-coroutines-core version to 1.3.9
我在共享模块的 build.gradle.kts 文件中有这些依赖项。
val coroutinesVersion = "1.3.9-native-mt"
val serializationVersion = "1.0.1"
val ktorVersion = "1.4.2"
val sqlDelightVersion = "1.4.4"
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-serialization:$ktorVersion")
implementation("com.squareup.sqldelight:runtime:$sqlDelightVersion")
implementation("com.squareup.sqldelight:coroutines-extensions:$sqlDelightVersion")
}
}
...
}
当我 运行 应用程序在 android 应用程序中一切正常。但是 运行 在 ios 应用程序中 运行 时出现崩溃。在日志中,我看到 Ktor
抱怨协程版本不是 native-mt
。我不明白为什么因为 1.4.# 版本的协程没有单独的本机多线程分支。
我查看了 External Libraries 文件夹,发现我的协程版本一直设置为 1.3.9。如果我删除 com.squareup.sqldelight:coroutines-extensions 一切又都正常了。但是我需要这种依赖性才能从 db.
中消耗 Flow
我尝试从 sqldelight 扩展中排除协程,但它没有在 Xcode 构建中编译。
implementation("com.squareup.sqldelight:coroutines-extensions:$sqlDelightVersion") {
exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core")
}
所以我的问题是:
- 为什么 SQLDelight 覆盖
kotlinx-coroutines-core
版本?
- 为什么 Ktor 想要
kotlinx-coroutines-core
版本只有 native-mt
后缀?
- 如何解决这个版本问题?
1 - 这是 SQLdelight 使用的版本。 Gradle 决定加入那个 vs ktor 想要的。
2 - Ktor 现在需要多线程版本。
3 - 解决方案
a - 强制使用 ktor 想要的版本。严格定义协程依赖与版本:
implementation(Deps.Coroutines.common) {
version {
strictly(Versions.coroutines)
}
}
b - 协程扩展是一个文件。我们需要更新 KaMPKit 并删除它,但我们将一个版本复制到源代码中以避免 SQLDelight 的早期问题:https://github.com/touchlab/KaMPKit/blob/master/shared/src/commonMain/kotlin/co/touchlab/kampkit/sqldelight/CoroutinesExtensions.kt
c - SQLDelight 需要升级版本。我可以在接下来的几天里解决这个问题,但不确定什么时候准备好。你就等着吧?
我在共享模块的 build.gradle.kts 文件中有这些依赖项。
val coroutinesVersion = "1.3.9-native-mt"
val serializationVersion = "1.0.1"
val ktorVersion = "1.4.2"
val sqlDelightVersion = "1.4.4"
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-serialization:$ktorVersion")
implementation("com.squareup.sqldelight:runtime:$sqlDelightVersion")
implementation("com.squareup.sqldelight:coroutines-extensions:$sqlDelightVersion")
}
}
...
}
当我 运行 应用程序在 android 应用程序中一切正常。但是 运行 在 ios 应用程序中 运行 时出现崩溃。在日志中,我看到 Ktor
抱怨协程版本不是 native-mt
。我不明白为什么因为 1.4.# 版本的协程没有单独的本机多线程分支。
我查看了 External Libraries 文件夹,发现我的协程版本一直设置为 1.3.9。如果我删除 com.squareup.sqldelight:coroutines-extensions 一切又都正常了。但是我需要这种依赖性才能从 db.
中消耗Flow
我尝试从 sqldelight 扩展中排除协程,但它没有在 Xcode 构建中编译。
implementation("com.squareup.sqldelight:coroutines-extensions:$sqlDelightVersion") {
exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core")
}
所以我的问题是:
- 为什么 SQLDelight 覆盖
kotlinx-coroutines-core
版本? - 为什么 Ktor 想要
kotlinx-coroutines-core
版本只有native-mt
后缀? - 如何解决这个版本问题?
1 - 这是 SQLdelight 使用的版本。 Gradle 决定加入那个 vs ktor 想要的。
2 - Ktor 现在需要多线程版本。
3 - 解决方案
a - 强制使用 ktor 想要的版本。严格定义协程依赖与版本:
implementation(Deps.Coroutines.common) {
version {
strictly(Versions.coroutines)
}
}
b - 协程扩展是一个文件。我们需要更新 KaMPKit 并删除它,但我们将一个版本复制到源代码中以避免 SQLDelight 的早期问题:https://github.com/touchlab/KaMPKit/blob/master/shared/src/commonMain/kotlin/co/touchlab/kampkit/sqldelight/CoroutinesExtensions.kt
c - SQLDelight 需要升级版本。我可以在接下来的几天里解决这个问题,但不确定什么时候准备好。你就等着吧?