Spec-Zone.ru › Kotlin 1.8

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

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

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

© 2010–2023 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