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