Spec-Zone.ru › Kotlin 1.9

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

Вы можете опубликовать многоплатформенную библиотеку в локальный репозиторий 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
    }
}

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

Отключение публикации исходных кодов

По умолчанию плагин 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()
    }
    
Последнее изменение: 13 июля 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