Публикация многоплатформенной библиотеки
Вы можете опубликовать многоплатформенную библиотеку в репозиторий Maven с помощью maven-publish плагина Gradle. Укажите группу, версию и репозитории, в которых должна быть опубликована библиотека. Плагин создает публикации автоматически.
plugins {
//...
id("maven-publish")
}
group = "com.example"
version = "1.0"
publishing {
repositories {
maven{
//...
}
}
}
Публикации создаются автоматически для каждой цели, которая может быть построена на текущем хосте, за исключением цели Android, для которой требуется дополнительный шаг для настройки публикации.
Публикации многоплатформенной библиотеки включают дополнительную публикацию 'root' kotlinMultiplatform, которая представляет собой всю библиотеку и автоматически разрешается до соответствующих артефактов для конкретной платформы при добавлении в качестве зависимости к общему набору исходных кодов. Узнайте больше о добавлении зависимостей.
Эта kotlinMultiplatform публикация не включает никаких артефактов и только ссылается на другие публикации в качестве своих вариантов. Однако ей могут потребоваться артефакты исходных кодов и документации, если это необходимо репозиторию. В этом случае добавьте эти артефакты, используя artifact(...) в области видимости публикации.
Чтобы избежать дублирования публикаций модулей, которые могут быть построены на нескольких платформах (например, JVM, JS, Kotlin metadata), настройте задачи публикации для этих модулей на условное выполнение.
Вы можете определить платформу в скрипте, ввести флаг, например isMainHost, и установить его в значение true для основной целевой платформы. В качестве альтернативы вы можете передать флаг из внешнего источника, например, из конфигурации CI.
Этот упрощенный пример гарантирует, что публикации будут загружены только при передаче isMainHost=true. Это означает, что публикация, которая может быть опубликована с нескольких платформ, будет опубликована только один раз — с основного хоста.
kotlin {
jvm()
js()
mingwX64()
linuxX64()
// Note that the Kotlin metadata is here, too.
configure([targets["metadata"], jvm(), js()]) {
mavenPublication { targetPublication ->
tasks.withType(AbstractPublishToMaven)
.matching { it.publication == targetPublication }
.all { onlyIf { findProperty("isMainHost") == "true" } }
}
}
}
kotlin {
jvm()
js()
mingwX64()
linuxX64()
// Note that the Kotlin metadata is here, too.
configure(listOf(targets["metadata"], jvm(), js())) {
mavenPublication {
val targetPublication = this@mavenPublication
tasks.withType<AbstractPublishToMaven>()
.matching { it.publication == targetPublication }
.all { onlyIf { findProperty("isMainHost") == "true" } }
}
}
}
По умолчанию каждая публикация включает JAR-файл исходных кодов, содержащий исходные коды, используемые основной компиляцией целевого объекта.
Публикация библиотеки Android
Для публикации библиотеки Android необходимо предоставить дополнительную конфигурацию.
По умолчанию артефакты библиотеки Android не публикуются. Чтобы опубликовать артефакты, созданные набором вариантов Android, укажите имена вариантов в блоке цели Android:
kotlin {
android {
publishLibraryVariants("release", "debug")
}
}
Пример работает для библиотек Android без продуктовых вкусов. Для библиотеки с продуктовыми вкусами имена вариантов также содержат вкусы, такие как fooBarDebug или fooBazRelease.
Если потребитель библиотеки определяет варианты, отсутствующие в библиотеке, ему необходимо предоставить соответствующие резервные варианты. Например, если библиотека не имеет или не публикует тип сборки staging, потребитель библиотеки должен предоставить резервную копию для потребителей, у которых есть такой тип сборки, указав как минимум один из типов сборки, публикуемых библиотекой:
android { buildTypes { staging { // ... matchingFallbacks = ['release', 'debug'] } } }android { buildTypes { val staging by creating { // ... matchingFallbacks = listOf("release", "debug") } } }
Аналогично, потребителю библиотеки необходимо предоставить соответствующие резервные варианты для настраиваемых продуктовых вкусов, если некоторые из них отсутствуют в публикациях библиотеки.
Вы также можете публиковать варианты, сгруппированные по продуктовому вкусу, так что выходные данные разных типов сборки размещаются в одном модуле, и тип сборки становится классификатором для артефактов (тип сборки release всё ещё публикуется без классификатора). Этот режим отключен по умолчанию и может быть включен следующим образом:
kotlin {
android {
publishLibraryVariantsGroupedByFlavor = true
}
}
Не рекомендуется публиковать варианты, сгруппированные по продуктовому вкусу, в случае, если у них разные зависимости, так как они будут объединены в один список зависимостей.
© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/mpp-publish-lib.html