Kotlin MultiPlatform - 发布 Android 库失败
Posted
技术标签:
【中文标题】Kotlin MultiPlatform - 发布 Android 库失败【英文标题】:Kotlin MultiPlatform - Publish Android Library Failing 【发布时间】:2021-02-22 18:56:02 【问题描述】:我正在尝试使用新的 Kotlin MultiPlatform 设置发布一个 android 库(调试/发布)。我成功地能够发布 ios 框架,但不能发布 android 库。这是我最终得到的错误:
配置项目 ':shared' 时出现问题。
未能通知项目评估侦听器。 Kotlin 目标“android”尝试为非库变体或不存在的 Android 构建变体设置发布: * 发布 * 调试 检查 'publishLibraryVariants' 属性,它应该指向现有的 Android 库变体。不支持发布应用程序和测试变体。
但是,我可以清楚地看到我的 Android Studio 中的变体。我还能够使用库依赖项作为项目依赖项从 Android Studio 运行 Android/IOS 应用程序
implementation(project(":shared"))
只有在尝试发布时才会遇到问题。
这是我的 build.gradle.kts:
plugins
kotlin("multiplatform")
kotlin("plugin.serialization")
id("com.android.library")
id("kotlin-android-extensions")
id("com.squareup.sqldelight")
id("dev.icerock.mobile.multiplatform-resources")
`maven-publish`
group = "com.sekhar.testkmp"
version = "0.1"
val coroutinesVersion = "1.3.9-native-mt"
val serializationVersion = "1.0.0-RC"
val ktorVersion = "1.4.0"
val sqlDelightVersion: String by project
repositories
gradlePluginPortal()
google()
jcenter()
mavenCentral()
kotlin
android
publishLibraryVariants("release", "debug")
ios
binaries
framework
baseName = "shared"
sourceSets
val commonMain by getting
dependencies
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:$serializationVersion")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-serialization:$ktorVersion")
implementation("com.squareup.sqldelight:runtime:$sqlDelightVersion")
implementation("dev.icerock.moko:resources:0.13.1")
implementation("dev.icerock.moko:parcelize:0.4.0")
implementation("dev.icerock.moko:graphics:0.4.0")
val commonTest by getting
dependencies
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
val androidMain by getting
dependencies
implementation("com.google.android.material:material:1.2.1")
implementation("io.ktor:ktor-client-android:$ktorVersion")
implementation("com.squareup.sqldelight:android-driver:$sqlDelightVersion")
val androidTest by getting
dependencies
implementation(kotlin("test-junit"))
implementation("junit:junit:4.12")
val iosMain by getting
dependencies
implementation("io.ktor:ktor-client-ios:$ktorVersion")
implementation("com.squareup.sqldelight:native-driver:$sqlDelightVersion")
val iosTest by getting
dependencies
commonMainApi("dev.icerock.moko:resources:0.13.1")
multiplatformResources
multiplatformResourcesPackage = "com.sekhar.testkmp" // required
android
compileSdkVersion(29)
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig
minSdkVersion(24)
targetSdkVersion(29)
versionCode = 1
versionName = "1.0"
compileOptions
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
buildTypes
getByName("release")
isMinifyEnabled = false
getByName("debug")
isMinifyEnabled = false
lintOptions
isAbortOnError = false
val packForXcode by tasks.creating(Sync::class)
group = "build"
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from( framework.outputDirectory )
into(targetDir)
tasks.getByName("build").dependsOn(packForXcode)```
【问题讨论】:
【参考方案1】:对此最常见的解决方案是在kotlin
多平台插件:kotlin("multiplatform")
之前应用android
插件:id("com.android.library")
。
plugins
id("com.android.library")
kotlin("multiplatform")
kotlin("plugin.serialization")
id("kotlin-android-extensions")
id("com.squareup.sqldelight")
id("dev.icerock.mobile.multiplatform-resources")
`maven-publish`
【讨论】:
非常感谢!这解决了它。 @dazza5000 你能解释一下为什么会这样吗? 没有。我的猜测是每个插件都会修改 gradle 任务图,修改树的顺序很重要。以上是关于Kotlin MultiPlatform - 发布 Android 库失败的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin-multiplatform:如何执行 iOS 单元测试
在 kotlin-multiplatform 上生成 UUID?
Kotlin Multiplatform 项目包含 cocoapod 依赖项
Kotlin MultiPlatform - 发布 Android 库失败