Я создал Kotlin MPP для совместного использования утилит Json между JVM и JS. Весь код находится в общем исходном наборе, и я настроил необходимые цели с их соответствующими зависимостями. Без дополнительной настройки я могу использовать утилиты как 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()
}
}
Однако это пока не кажется правильным.
В официальной документации такого фрагмента кода нет.
В документации говорится, что одной зависимости из общего исходного набора должно быть достаточно для автоматического разрешения конкретных целевых зависимостей: https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#metadata-публикация. Мне пришлось добавить зависимости для каждой цели, соответственно, чтобы она работала.
this as MavenPublication
необходимо, потому чтоPublication
не имеет поляartifactId
.Я использую
project.name
вместоlibraryName
.
Это хотя бы отдаленно правильный способ делать что-то, или мне не хватает другого варианта, который сделал бы весь процесс тривиальным?
Сейчас я использую Kotlin 1.3.72
и Gradle 5.2.1
с enableFeaturePreview("GRADLE_METADATA")
в 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"))
}
}
}
}
build.gradle.kts
. - person Marvin   schedule 31.07.2020