Spec-Zone.ru › Kotlin 1.8

Публикация многоплатформенных библиотек

Вы можете опубликовать многоплатформенную библиотеку в локальный Maven-репозиторий с помощью maven-publish плагина Gradle. Укажите группу, версию и репозитории, в которые должна быть опубликована библиотека. Плагин создаёт публикации автоматически.

plugins {
    //...
    id("maven-publish")
}

group = "com.example"
version = "1.0"

publishing {
    repositories {
        maven {
            //...
        }
    }
}

Чтобы получить практический опыт и узнать, как опубликовать многоплатформенную библиотеку в внешний репозиторий Maven Central, ознакомьтесь с созданием и публикацией многоплатформенной библиотеки учебным пособием.

Вы также можете опубликовать многоплатформенную библиотеку в репозиторий GitHub. Дополнительную информацию можно найти в документации GitHub по пакетам GitHub.

Структура публикаций

При использовании maven-publish, плагин Kotlin автоматически создаёт публикации для каждого целевого устройства, которое может быть построено на текущей платформе, за исключением Android, для которого требуется дополнительный шаг для настройки публикации.

Публикации многоплатформенной библиотеки включают дополнительную публикацию корневую kotlinMultiplatform , которая представляет всю библиотеку и автоматически разрешается до соответствующих артефактов для каждой платформы при добавлении в качестве зависимости в общий набор исходных кодов. Подробнее о добавлении зависимостей.

Эта kotlinMultiplatform публикация включает артефакты метаданных и ссылается на другие публикации в качестве своих вариантов.

Некоторые репозитории, такие как Maven Central, требуют, чтобы корневой модуль содержал JAR-артефакт без классификатора, например kotlinMultiplatform-1.0.jar.
Плагин Kotlin Multiplatform автоматически создаёт необходимый артефакт с вложенными артефактами метаданных.
Это означает, что вам не нужно настраивать свой сборку, добавляя пустой артефакт в корневой модуль вашей библиотеки, чтобы удовлетворить требованиям репозитория.

Для 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
    }
}

Не рекомендуется публиковать варианты, сгруппированные по продуктовому вкусу, если они имеют разные зависимости, так как они будут объединены в один список зависимостей.

Последнее изменение: 10 января 2023
Создание и публикация многоплатформенной библиотеки — учебник Обмен кодом на платформах

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API