Spec-Zone.ru › Kotlin 1.7

Иерархическая структура проекта

С Kotlin 1.6.20 каждый новый многоплатформенный проект поставляется с иерархической структурой проекта. Это означает, что наборы исходных кодов образуют иерархию для совместного использования общего кода между несколькими целевыми платформами. Это открывает множество возможностей, включая использование платформенно-зависимых библиотек в общих наборах исходных кодов и возможность совместного использования кода при создании многоплатформенных библиотек.

Чтобы получить стандартную иерархическую структуру проекта в своих проектах, обновитесь до последней версии. Если вам необходимо использовать более раннюю версию, чем 1.6.20, вы всё равно можете включить эту функцию вручную. Для этого добавьте следующее в ваш gradle.properties:

kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false

Для авторов многоплатформенных проектов

С поддержкой новой иерархической структуры проекта вы можете совместно использовать код между некоторыми, но не всеми, целевыми платформами в многоплатформенном проекте.

Вы также можете использовать платформенно-зависимые библиотеки, такие как UIKit и POSIX, в наборах исходных кодов, используемых для нескольких целевых платформ. Один из распространённых случаев — доступ к зависимостям, специфичным для iOS, таким как Foundation, при совместном использовании кода между всеми целевыми платформами iOS. Новая структура помогает вам совместно использовать больше кода для нативных платформ, не ограничиваясь платформенно-специфическими зависимостями.

Используя иерархическую структуру вместе с платформенно-зависимыми библиотеками в общих наборах исходных кодов, вы можете исключить необходимость использования обходных путей для получения поддержки IDE для совместного использования наборов исходных кодов между несколькими целевыми платформами, например, iosArm64 и iosX64:

// workaround 1: select iOS target platform depending on the Xcode environment variables kotlin { val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget = if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true) ::iosArm64 else ::iosX64 iOSTarget("ios") }
# workaround 2: make symbolic links to use one source set for two targets ln -s iosMain iosArm64Main && ln -s iosMain iosX64Main

Вместо этого вы можете создать иерархическую структуру с сокращениями для целевых платформ, доступными для типовых многоцелевых сценариев, или вручную объявить и подключить наборы исходных кодов. Например, вы можете создать две целевые платформы iOS и общий набор исходных кодов с сокращением ios():

kotlin {
    ios() // iOS device and simulator targets; iosMain and iosTest source sets
}

Инструментарий Kotlin обеспечит правильные зависимости по умолчанию и найдёт доступную область API в общем коде. Это предотвращает случаи, когда функция, специфичная для macOS, используется в коде, предназначенном для Windows.

Для авторов библиотек

Иерархическая структура проекта позволяет повторно использовать код в похожих целевых платформах, а также публиковать и использовать библиотеки с гранулированными API, ориентированными на похожие платформы.

Инструментарий Kotlin автоматически определит доступную в потребительском наборе исходных кодов область API, проверяя небезопасные использования, такие как использование API, предназначенного для JVM, в коде JS.

  • Библиотеки, опубликованные с новой иерархической структурой проекта, совместимы только с проектами, которые уже имеют иерархическую структуру проекта. Чтобы обеспечить совместимость с проектами без иерархической структуры, добавьте следующее в файл gradle.properties в вашем проекте библиотеки:

    kotlin.mpp.enableCompatibilityMetadataVariant=true
    

В этом случае только исходный код из набора исходных кодов commonMain компилируется с помощью компилятора метаданных старого формата. Если вы используете платформенно-специфичный код в commonMain, его компиляция в старый формат завершится ошибкой.

  • Библиотеки, опубликованные без иерархической структуры проекта, не могут использоваться в общем наборе исходных кодов для нативных платформ. Например, пользователи с сокращениями ios() в своих файлах build.gradle.(kts) не смогут использовать вашу библиотеку в своём коде, общем для iOS.

См. Совместимость для получения более подробной информации.

Совместимость

Совместимость между многоплатформенными проектами и библиотеками определяется следующим образом:

Библиотека с иерархической структурой проекта

Проект с иерархической структурой проекта

Совместимость

Да

Да

✅

Да

Нет

Необходимо включить с помощью enableCompatibilityMetadataVariant в проекте библиотеки

Нет

Да

Библиотеку нельзя использовать в общем наборе исходных кодов нативной платформы

Нет

Нет

✅

Как отключить

Чтобы отключить поддержку иерархической структуры, установите следующую опцию в значение false в вашем gradle.properties:

kotlin.mpp.hierarchicalStructureSupport=false

Что касается опции kotlin.mpp.enableCompatibilityMetadataVariant, которая включает совместимость библиотек, опубликованных с иерархической структурой проекта, с проектами без неё — она отключена по умолчанию. Дополнительные действия не требуются.

Последнее изменение: 04 апреля 2022 г.
Подключение к платформенно-специфичным API Добавление зависимостей от многоплатформенных библиотек

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform-hierarchy.html

Spec-Zone.ru

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