未找到 Kotlin Multiplatrom Mobile 库的匹配变体
No matching variant of Kotlin Multiplatrom Mobile library found
我有一个发布到 Maven Central 的 Kotlin Multiplatform Mobile library。我也在尝试在非 KMM Android 应用程序中使用这个库。当我在 android 应用程序中声明依赖项时,出现此错误
Execution failed for task ':app:checkDebugAarMetadata'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
> Could not resolve io.github.tyczj:tweedle-android:0.3.0.
Required by:
project :app
> No matching variant of io.github.tyczj:tweedle-android:0.3.0 was found. The consumer was configured to find a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but:
- Variant 'commonMainMetadataElements-published' capability io.github.tyczj:tweedle-android:0.3.0:
- Incompatible because this component declares a usage of 'kotlin-api' of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'common' and the consumer needed a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm'
- Other compatible attribute:
- Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'debug')
- Variant 'metadataApiElements-published' capability io.github.tyczj:tweedle-android:0.3.0:
- Incompatible because this component declares a usage of 'kotlin-metadata' of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'common' and the consumer needed a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm'
- Other compatible attribute:
- Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'debug')
- Variant 'releaseApiElements-published' capability io.github.tyczj:tweedle-android:0.3.0 declares a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm':
- Incompatible because this component declares an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release' and the consumer needed a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug'
- Variant 'releaseRuntimeElements-published' capability io.github.tyczj:tweedle-android:0.3.0 declares a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm':
- Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug'
我假设我的配置有问题,但我真的不知道那个错误告诉我什么,这是我第一次创建 KMM 库。
这是我的 build.gradle.kts
import org.gradle.api.tasks.bundling.Jar
plugins {
kotlin("multiplatform")
id("com.android.library")
id("kotlin-android-extensions")
id("kotlinx-serialization")
id("maven-publish")
id("signing")
}
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
val javadocJar by tasks.registering(Jar::class) {
archiveClassifier.set("javadoc")
}
group = "io.github.tyczj"
version = "0.3.0"
kotlin {
android{
publishLibraryVariants("release")
}
ios {
binaries {
framework {
baseName = "tweedle"
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.1")
implementation("io.ktor:ktor-client-json:1.5.1")
implementation("io.ktor:ktor-client-serialization:1.5.1")
implementation("io.ktor:ktor-client-logging:1.5.1")
implementation("ch.qos.logback:logback-classic:1.2.3")
// implementation("com.squareup.okio:okio:2.10.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2-native-mt"){
version {
strictly("1.4.2-native-mt")
}
}
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependencies {
implementation("androidx.core:core-ktx:1.3.2")
implementation("io.ktor:ktor-client-android:1.5.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2-native-mt")
implementation("com.github.scribejava:scribejava-apis:8.3.0")
}
}
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:1.5.1")
}
}
// val iosTest by getting
}
}
android {
compileSdkVersion(30)
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdkVersion(26)
targetSdkVersion(30)
versionCode = 1
versionName = "1.0"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
packagingOptions {
excludes.add("META-INF/*.kotlin_module")
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().all {
kotlinOptions {
jvmTarget = "1.8"
}
}
}
afterEvaluate {
publishing {
repositories {
maven {
name = "sonatype"
url = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
credentials {
username = rootProject.ext["ossrhUsername"]?.toString()
password = rootProject.ext["ossrhPassword"]?.toString()
}
}
}
publications.withType<MavenPublication> {
artifact(javadocJar.get())
pom{
name.set("Tweedle")
description.set("Tweedle is an Android library built around the Twitter v2 API built fully in Kotlin using Kotlin Coroutines")
url.set("https://github.com/tyczj/Tweedle")
licenses {
license {
name.set("MIT")
url.set("https://opensource.org/licenses/MIT")
}
}
developers {
developer {
id.set("tyczj")
name.set("Jeff Tycz")
email.set("tyczj359@gmail.com")
}
}
scm {
url.set("https://github.com/tyczj/Tweedle")
}
}
}
}
}
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<org.jetbrains.kotlin.gradle.plugin.mpp.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)
ext["signing.keyId"] = rootProject.ext["signing.keyId"]?.toString()
ext["signing.password"] = rootProject.ext["signing.password"]?.toString()
ext["signing.secretKeyRingFile"] = rootProject.ext["signing.secretKeyRingFile"]?.toString()
signing {
sign(publishing.publications)
}
我需要做什么才能在非 KMM android 应用程序中使用 android 依赖项 (io.github.tyczj:tweedle-android)
?
更新
我尝试将“调试”添加到 android 库变体
android{
publishLibraryVariants("release", "debug")
}
以及添加回退
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
val staging by creating{
setMatchingFallbacks(listOf("release", "debug"))
}
}
那什么也没做
如果我创建一个新的 KMM 项目并尝试添加依赖项,我会得到一些不同的错误提示
Failed building KotlinMPPGradleModel
org.gradle.internal.resolve.ArtifactNotFoundException: Could not find tweedle-android-0.3.1-samplessources.jar (io.github.tyczj:tweedle-android:0.3.1).
我猜你将库发布为 aar。在这种情况下,您应该显式地将 @aar 添加到 gradle dependency
implementation 'io.github.tyczj:tweedle-android:0.3.0@aar'
当您包含不是为正确平台构建的依赖项时,会出现引用“samplessources”的错误消息。 this youtrack issue, as well as this other issue 中有一些关于在这种情况下发出更好的错误消息的讨论。
在您的情况下,它可能是由您的共同依赖项中的 implementation("ch.qos.logback:logback-classic:1.2.3")
触发的。这是一个 JVM 库,但你有一个 iOS 目标,所以它不能在你的公共依赖项中工作。将其移至您的 Android 依赖项。
我有一个发布到 Maven Central 的 Kotlin Multiplatform Mobile library。我也在尝试在非 KMM Android 应用程序中使用这个库。当我在 android 应用程序中声明依赖项时,出现此错误
Execution failed for task ':app:checkDebugAarMetadata'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
> Could not resolve io.github.tyczj:tweedle-android:0.3.0.
Required by:
project :app
> No matching variant of io.github.tyczj:tweedle-android:0.3.0 was found. The consumer was configured to find a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but:
- Variant 'commonMainMetadataElements-published' capability io.github.tyczj:tweedle-android:0.3.0:
- Incompatible because this component declares a usage of 'kotlin-api' of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'common' and the consumer needed a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm'
- Other compatible attribute:
- Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'debug')
- Variant 'metadataApiElements-published' capability io.github.tyczj:tweedle-android:0.3.0:
- Incompatible because this component declares a usage of 'kotlin-metadata' of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'common' and the consumer needed a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm'
- Other compatible attribute:
- Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'debug')
- Variant 'releaseApiElements-published' capability io.github.tyczj:tweedle-android:0.3.0 declares a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm':
- Incompatible because this component declares an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release' and the consumer needed a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug'
- Variant 'releaseRuntimeElements-published' capability io.github.tyczj:tweedle-android:0.3.0 declares a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm':
- Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug'
我假设我的配置有问题,但我真的不知道那个错误告诉我什么,这是我第一次创建 KMM 库。
这是我的 build.gradle.kts
import org.gradle.api.tasks.bundling.Jar
plugins {
kotlin("multiplatform")
id("com.android.library")
id("kotlin-android-extensions")
id("kotlinx-serialization")
id("maven-publish")
id("signing")
}
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
val javadocJar by tasks.registering(Jar::class) {
archiveClassifier.set("javadoc")
}
group = "io.github.tyczj"
version = "0.3.0"
kotlin {
android{
publishLibraryVariants("release")
}
ios {
binaries {
framework {
baseName = "tweedle"
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:1.5.1")
implementation("io.ktor:ktor-client-json:1.5.1")
implementation("io.ktor:ktor-client-serialization:1.5.1")
implementation("io.ktor:ktor-client-logging:1.5.1")
implementation("ch.qos.logback:logback-classic:1.2.3")
// implementation("com.squareup.okio:okio:2.10.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2-native-mt"){
version {
strictly("1.4.2-native-mt")
}
}
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependencies {
implementation("androidx.core:core-ktx:1.3.2")
implementation("io.ktor:ktor-client-android:1.5.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2-native-mt")
implementation("com.github.scribejava:scribejava-apis:8.3.0")
}
}
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:1.5.1")
}
}
// val iosTest by getting
}
}
android {
compileSdkVersion(30)
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdkVersion(26)
targetSdkVersion(30)
versionCode = 1
versionName = "1.0"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
packagingOptions {
excludes.add("META-INF/*.kotlin_module")
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().all {
kotlinOptions {
jvmTarget = "1.8"
}
}
}
afterEvaluate {
publishing {
repositories {
maven {
name = "sonatype"
url = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/")
credentials {
username = rootProject.ext["ossrhUsername"]?.toString()
password = rootProject.ext["ossrhPassword"]?.toString()
}
}
}
publications.withType<MavenPublication> {
artifact(javadocJar.get())
pom{
name.set("Tweedle")
description.set("Tweedle is an Android library built around the Twitter v2 API built fully in Kotlin using Kotlin Coroutines")
url.set("https://github.com/tyczj/Tweedle")
licenses {
license {
name.set("MIT")
url.set("https://opensource.org/licenses/MIT")
}
}
developers {
developer {
id.set("tyczj")
name.set("Jeff Tycz")
email.set("tyczj359@gmail.com")
}
}
scm {
url.set("https://github.com/tyczj/Tweedle")
}
}
}
}
}
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<org.jetbrains.kotlin.gradle.plugin.mpp.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)
ext["signing.keyId"] = rootProject.ext["signing.keyId"]?.toString()
ext["signing.password"] = rootProject.ext["signing.password"]?.toString()
ext["signing.secretKeyRingFile"] = rootProject.ext["signing.secretKeyRingFile"]?.toString()
signing {
sign(publishing.publications)
}
我需要做什么才能在非 KMM android 应用程序中使用 android 依赖项 (io.github.tyczj:tweedle-android)
?
更新
我尝试将“调试”添加到 android 库变体
android{
publishLibraryVariants("release", "debug")
}
以及添加回退
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
val staging by creating{
setMatchingFallbacks(listOf("release", "debug"))
}
}
那什么也没做
如果我创建一个新的 KMM 项目并尝试添加依赖项,我会得到一些不同的错误提示
Failed building KotlinMPPGradleModel
org.gradle.internal.resolve.ArtifactNotFoundException: Could not find tweedle-android-0.3.1-samplessources.jar (io.github.tyczj:tweedle-android:0.3.1).
我猜你将库发布为 aar。在这种情况下,您应该显式地将 @aar 添加到 gradle dependency
implementation 'io.github.tyczj:tweedle-android:0.3.0@aar'
当您包含不是为正确平台构建的依赖项时,会出现引用“samplessources”的错误消息。 this youtrack issue, as well as this other issue 中有一些关于在这种情况下发出更好的错误消息的讨论。
在您的情况下,它可能是由您的共同依赖项中的 implementation("ch.qos.logback:logback-classic:1.2.3")
触发的。这是一个 JVM 库,但你有一个 iOS 目标,所以它不能在你的公共依赖项中工作。将其移至您的 Android 依赖项。