【发布时间】:2020-11-20 09:27:46
【问题描述】:
我创建了一个 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()
}
}
但是,这感觉还不太对。
-
官方文档中没有sn-p这样的代码。
-
文档宣传来自公共源集的单个依赖项应该足以自动解决目标特定依赖项:https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#metadata-publishing。我必须分别为每个目标添加依赖项才能使其工作。
-
this as MavenPublication是必需的,因为Publication没有字段artifactId。 -
我使用
project.name而不是libraryName。
这甚至是正确的做事方式,还是我错过了一些其他选项,这会使整个过程变得微不足道?
现在我在 settings.gradle.kts 中使用 Kotlin 1.3.72 和 Gradle 5.2.1 和 enableFeaturePreview("GRADLE_METADATA")。我也用 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"))
}
}
}
}
【问题讨论】:
-
扔掉那个“解决方案”。你是在推动 bintray 还是 maven central/sonatype?
-
给我一个更好的,我很高兴这样做。这是一个小型个人项目,所以我现在将发布到我自己的 maven 存储库。
-
人们通常发布到 bintray 或 sonatype。我不确定你自己的 maven repo 是什么,除非你的意思是我猜是本地的。
-
明确地说,对元数据做一些特殊的事情是错误的。你完全不需要。我没有解释如何配置发布的博文,但我可以向您指出我们发布的大量库,包括公共和本地存储库。
-
另外,发布您的配置的其余部分,Gradle、Kotlin 的版本等。您的配置的那部分将不再存在,因为它不是必需的,但查看其余部分会很有用你的配置。
标签: maven kotlin gradle gradle-kotlin-dsl kotlin-multiplatform