首页 > 解决方案 > 使用 Gradle Kotlin DSL 发布 Kotlin MPP 元数据

问题描述

我创建了一个 Kotlin MPP 在 JVM 和 JS 之间共享 Json 实用程序。所有代码都位于公共源集中,我已经配置了必要的目标及其各自的依赖项。无需进一步配置,我就可以使用来自 JVM 和 JS 的实用程序,但不能来自另一个 MPP 的公共源集,这与 Gradle 处理元数据的方式有关。

我已经找到了解决方案(取自https://medium.com/xorum-io/crafting-and-publishing-kotlin-multiplatform-library-to-bintray-cbc00a4f770

afterEvaluate {
    project.publishing.publications.all {
        groupId = group
        if (it.name.contains('metadata')) {
            artifactId = "$libraryName"
        } else {
            artifactId = "$libraryName-$name"
        }
    }
}

我还让它与 Gradle Kotlin DSL 一起工作:

afterEvaluate {
    publishing.publications.all {
        this as MavenPublication
        artifactId = project.name + "-$name".takeUnless { "metadata" in name }.orEmpty()
    }
}

但是,这感觉还不太对劲。

  1. 官方文档中没有这样的代码片段。

  2. 该文档宣传来自公共源集的单个依赖项应该足以自动解决目标特定依赖项:https ://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#metadata-publishing 。我必须分别为每个目标添加依赖项才能使其正常工作。

  3. this as MavenPublication是必要的,因为Publication没有字段artifactId

  4. 我使用project.name而不是libraryName.

这甚至是远程做事的正确方法,还是我错过了一些其他选项,这会使整个过程变得微不足道?

现在我正在使用 Kotlin1.3.72和 Gradle5.2.1enableFeaturePreview("GRADLE_METADATA")in settings.gradle.kts。我也用 Gradle 6.5.1(最新)试过它,但它的行为完全一样。

现在我很高兴它可以正常工作,但我怀疑有一种更清洁的方法可以做到这一点。如果有更多 Gradle 专业知识的人能为我解决问题或为我指明正确的方向,我将不胜感激。

编辑:

gradle.build.kts为了完整性。虽然这里没有太多事情发生。

group = "org.example"
version = "1.0-SNAPSHOT"

plugins {
    kotlin("multiplatform") version "1.3.72"
    `maven-publish`
}

repositories {
    mavenCentral()
}

kotlin {
    jvm()

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation(kotlin("stdlib-common"))
            }
        }

        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib"))
            }
        }
    }
}

标签: mavenkotlingradlegradle-kotlin-dslkotlin-multiplatform

解决方案


毕竟真的没有问题。解决方案是也简单地添加enableFeaturePreview("GRADLE_METADATA")到消费项目中。

根据https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#metadata-publishing这不应该是必要的:

在从 5.3 开始的早期 Gradle 版本中,模块元数据在依赖解析期间使用,但默认情况下发布不包含任何模块元数据。要启用模块元数据发布,请将 enableFeaturePreview("GRADLE_METADATA") 添加到根项目的 settings.gradle 文件中。

奇怪的是,它仅在发布项目和消费项目都启用了元数据时才有效,即使两者都使用最新的 Gradle 版本。


推荐阅读