Иерархическая структура проекта
С 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–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