Иерархическая структура проекта
С 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:
Вместо этого вы можете создать иерархическую структуру с ярлыками целевых платформ, доступными для типичных сценариев с несколькими целевыми платформами, или вручную объявить и подключить наборы исходных файлов. Например, вы можете создать две целевые платформы 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
Библиотеки, опубликованные без иерархической структуры проекта, не могут использоваться в общем наборе исходных файлов для нативной платформы. Например, пользователи с ярлыками
ios()в своих файлахbuild.gradle.(kts)не смогут использовать вашу библиотеку в своем коде для iOS.
См. Совместимость для получения более подробной информации.
Совместимость
Совместимость между многоплатформенными проектами и библиотеками определяется следующим образом:
Библиотека с иерархической структурой проекта |
Проект с иерархической структурой проекта |
Совместимость |
|---|---|---|
Да |
Да |
✅ |
Да |
Нет |
Необходимо включить с помощью |
Нет |
Да |
Библиотека не может использоваться в общем наборе исходных файлов для нативной платформы |
Нет |
Нет |
✅ |
Как отключить
Чтобы отключить поддержку иерархической структуры, установите указанный параметр в false в вашем gradle.properties:
kotlin.mpp.hierarchicalStructureSupport=false
Что касается параметра kotlin.mpp.enableCompatibilityMetadataVariant, который включает совместимость библиотек, опубликованных с иерархической структурой проекта, и проектов без неё — он отключен по умолчанию. Дополнительные шаги не требуются.
© 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