Публикация многоплатформенных библиотек
Вы можете опубликовать многоплатформенную библиотеку в локальный репозиторий Maven с помощью maven-publish плагина Gradle. Укажите группу, версию и репозитории, в которые должна быть опубликована библиотека. Плагин автоматически создаёт публикации.
plugins {
//...
id("maven-publish")
}
group = "com.example"
version = "1.0"
publishing {
repositories {
maven {
//...
}
}
}
Чтобы получить практический опыт и узнать, как опубликовать многоплатформенную библиотеку в внешний репозиторий Maven Central, ознакомьтесь с учебным пособием Создание и публикация многоплатформенной библиотеки.
Структура публикаций
При использовании maven-publish, плагин Kotlin автоматически создаёт публикации для каждого целевого типа, который может быть скомпилирован на текущей платформе, за исключением Android-цели, для которой требуется дополнительный шаг для настройки публикации.
Публикации многоплатформенной библиотеки включают дополнительную публикацию корня kotlinMultiplatform , которая представляет собой всю библиотеку и автоматически разрешается до соответствующих артефактов для определённой платформы при добавлении в качестве зависимости к общему набору исходных кодов. Подробнее о добавлении зависимостей.
Эта kotlinMultiplatform публикация включает артефакты метаданных и ссылается на другие публикации в качестве своих вариантов.
Для публикации kotlinMultiplatform также могут потребоваться артефакты исходных кодов и документации, если это требуется репозиторием. В этом случае добавьте эти артефакты, используя artifact(...) в области видимости публикации.
Избегайте дублирования публикаций
Чтобы избежать дублирования публикаций модулей, которые могут быть скомпилированы на нескольких платформах (например, JVM и JS), настройте задачи публикации для этих модулей таким образом, чтобы они выполнялись условно.
Вы можете определить платформу в скрипте, ввести флаг, например, isMainHost, и установить его в значение true для основной платформы. Кроме того, вы можете передать флаг из внешнего источника, например, из конфигурации CI.
Этот упрощённый пример гарантирует, что публикации будут загружены только при передаче isMainHost=true. Это означает, что публикация, которая может быть опубликована с нескольких платформ, будет опубликована только один раз – с основной платформы.
kotlin {
jvm()
js()
mingwX64()
linuxX64()
val publicationsFromMainHost =
listOf(jvm(), js()).map { it.name } + "kotlinMultiplatform"
publishing {
publications {
matching { it.name in publicationsFromMainHost }.all {
val targetPublication = this@all
tasks.withType<AbstractPublishToMaven>()
.matching { it.publication == targetPublication }
.configureEach { onlyIf { findProperty("isMainHost") == "true" } }
}
}
}
}
kotlin {
jvm()
js()
mingwX64()
linuxX64()
def publicationsFromMainHost =
[jvm(), js()].collect { it.name } + "kotlinMultiplatform"
publishing {
publications {
matching { it.name in publicationsFromMainHost }.all { targetPublication ->
tasks.withType(AbstractPublishToMaven)
.matching { it.publication == targetPublication }
.configureEach { onlyIf { findProperty("isMainHost") == "true" } }
}
}
}
}
По умолчанию каждая публикация включает JAR-файл исходных кодов, содержащий исходные коды, используемые для основной компиляции целевой платформы.
Публикация Android-библиотеки
Для публикации Android-библиотеки необходима дополнительная конфигурация.
По умолчанию артефакты Android-библиотеки не публикуются. Чтобы опубликовать артефакты, созданные набором Android-вариантов, укажите имена вариантов в блоке Android-цели:
kotlin {
android {
publishLibraryVariants("release", "debug")
}
}
Пример работает для Android-библиотек без продуктовых вкусов. Для библиотеки с продуктовыми вкусами имена вариантов также содержат вкусы, например, fooBarDebug или fooBazRelease.
Стандартная настройка публикации выглядит следующим образом:
Если опубликованные варианты имеют одинаковый тип сборки (например, все они
releaseилиdebug), они будут совместимы с любым типом сборки потребителя.Если опубликованные варианты имеют разные типы сборок, то совместимыми будут только варианты релизной сборки с потребительскими типами сборок, которые не входят в число опубликованных вариантов. Все остальные варианты (например,
debug) будут совместимы только с одинаковым типом сборки на стороне потребителя, если только проект потребителя не указывает соответствующие падения.
Если вы хотите сделать каждый опубликованный Android-вариант совместимым только с тем типом сборки, который используется потребителем библиотеки, установите эту свойство Gradle: kotlin.android.buildTypeAttribute.keep=true.
Вы также можете публиковать варианты, сгруппированные по продуктовому вкусу, чтобы выходные данные разных типов сборок размещались в одном модуле, а тип сборки становился классификатором для артефактов (релизный тип сборки всё равно публикуется без классификатора). Этот режим по умолчанию отключён и может быть включён следующим образом:
kotlin {
android {
publishLibraryVariantsGroupedByFlavor = true
}
}
Отключение публикации исходных кодов
По умолчанию плагин Kotlin Multiplatform Gradle публикует исходные коды для всех указанных целей. Однако вы можете настроить и отключить публикацию исходных кодов с помощью API withSourcesJar():
-
Чтобы отключить публикацию исходных кодов для всех целей:
kotlin { withSourcesJar(publish = false) jvm() linuxX64() } -
Чтобы отключить публикацию исходных кодов только для указанной цели:
kotlin { // Disable sources publication only for JVM: jvm { withSourcesJar(publish = false) } linuxX64() } -
Чтобы отключить публикацию исходных кодов для всех целей, кроме указанной:
kotlin { // Disable sources publication for all targets except for JVM: withSourcesJar(publish = false) jvm { withSourcesJar(publish = true) } linuxX64() }
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform-publish-lib.html