Spec-Zone.ru › Kotlin 1.6

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

С 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, который включает совместимость библиотек, опубликованных с иерархической структурой проекта, и проектов без неё — он отключен по умолчанию. Дополнительные шаги не требуются.

Последнее изменение: 07 апреля 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