【问题标题】:Can only add Kotlin Multiplatform Mobile library from maven by using releaseImplementation and debugImplementation只能使用 releaseImplementation 和 debugImplementation 从 maven 添加 Kotlin Multiplatform Mobile 库
【发布时间】:2021-08-13 05:59:42
【问题描述】:

每次我将 Kotlin Multiplatform Mobile 库发布到 maven Central 时,我似乎唯一可以在 Android 应用程序中添加/使用 Android 依赖项的方法是同时添加 releaseImplementationdebugImplementation

例子

releaseImplementation 'io.github.tyczj.lumberjack:Lumberjack-android:1.0.0@aar'
debugImplementation 'io.github.tyczj.lumberjack:Lumberjack-android-debug:1.0.0@aar'

而不是只有一个 implementation 的“正常”方式

implementation 'io.github.tyczj.lumberjack:Lumberjack-android:1.0.0'

这是我的 build.gradle 文件

plugins {
    kotlin("multiplatform") version "1.4.32"
    id("com.android.library")
    id("io.github.gradle-nexus.publish-plugin") version "1.1.0"
    id("maven-publish")
    id("signing")
}

group = "io.github.tyczj.lumberjack"
version = "1.0.2"

ext["signing.keyId"] = ""
ext["signing.password"] = ""
ext["signing.secretKeyRingFile"] = ""

repositories {
    google()
    mavenCentral()
    maven {
        setUrl("https://plugins.gradle.org/m2/")
    }
}

val javadocJar by tasks.registering(Jar::class) {
    archiveClassifier.set("javadoc")
}

val emptyJar by tasks.registering(Jar::class) {
    archiveAppendix.set("empty")
}

kotlin {
    android{
        publishLibraryVariants("release", "debug")
    }
    iosX64("ios") {
        binaries {
            framework {
                baseName = "lumberjack"
            }
        }
    }
    sourceSets {
        val commonMain by getting
        val commonTest by getting
        val androidMain by getting
        val androidTest by getting
        val iosMain by getting
        val iosTest by getting
    }
}

android {
    compileSdkVersion(29)
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdkVersion(24)
        targetSdkVersion(29)
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
        }
    }
}

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("Lumberjack")
                description.set("Logging library for Kotlin Multiplatform Mobile applications")
                url.set("https://github.com/tyczj/Lumberjack")
                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/Lumberjack")
                }
            }
        }
    }
}

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)
}

apply(from = "${rootDir}/scripts/publish-root.gradle")

这个库的完整源代码可以在here找到

我在构建/发布 KMM 库时必须指定发布和调试实现的方式有什么问题?

【问题讨论】:

    标签: android maven kotlin gradle kotlin-multiplatform


    【解决方案1】:

    您不应指定-android 后缀,只需使用implementation("io.github.tyczj.lumberjack:Lumberjack:1.0.0")

    这是因为依赖变体解析基于Gradle Module Metadata。此元数据只是与您的库一起发布的另一个文件(它具有 .module 扩展名),它包含所有变体的描述。当您将库作为一个整体发布时,顶级工件 io.github.tyczj.lumberjack:Lumberjack 包含整个库的元数据,允许 gradle 选择正确的变体。

    另一种选择是确保您的 -android 工件包含正确的模块元数据以及发布和调试变体。我相信publishLibraryVariantsGroupedByFlavor 是告诉发布者插件这样做的方式,但我没有尝试过。

    【讨论】:

    • 我认为没有 -android 或 -ios 的工件是 common 工件,这是不正确的假设吗?那么那些仅用于 KMM 特定模块吗?
    • 是和不是。根工件包含jar 文件,其中common 代码编译成.kotlin_metadata 形式,但这是将来可能会更改的实现细节。这里的关键是根工件包含 gradle 元数据 - Lumberjack-1.0.2.module,其中包含所有库变体的描述,包括所有变体特定文件的路径。这只是一个json文件,你可以打开浏览一下。
    • 我还建议您观看 kotlin 活动中的 this video,在该活动中,kotlin 开发人员解释了该出版物的工作原理和原因。
    • 对我不起作用 :( implementation "foo:bar:0.0.1" 仅适用于发布版本变体,而调试给我 Failed to resolve: bar-android-0.0.1-samplessources 错误。下一个代码工作正常,但看起来错误:releaseImplementation "foo:bar-android:0.0.1" debugImplementation "foo:bar-android-debug:0.0.1"
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2023-01-30
    • 2021-06-25
    • 2021-06-22
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2022-12-30
    相关资源
    最近更新 更多