Для чего нужен source set в Kotlin Multiplatform?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Назначение source set в Kotlin Multiplatform
Source set (исходный набор) — это фундаментальная концепция Kotlin Multiplatform (KMP), представляющая логическую группу исходных кодов Kotlin с общими зависимостями, настройками компиляции и целевым окружением. Это абстракция над физической структурой каталогов, позволяющая эффективно организовать код для нескольких платформ.
Ключевые цели и функции source set
- Сегрегация платформенно-специфичного и общего кода
Source set позволяют чётко разделять:
- Общий код (commonMain): Котлин-код, компилируемый для всех целевых платформ.
- Платформенные реализации (platform-specific): Код, специфичный для iOS, Android, JS и т.д.
// Пример: commonMain source set
// Общий интерфейс для всех платформ
expect class Platform() {
val name: String
}
// Пример: androidMain source set
// Реализация для Android
actual class Platform actual constructor() {
actual val name: String = "Android"
}
- Управление зависимостями на уровне source set
В
build.gradle.ktsзависимости объявляются для конкретных исходных наборов:
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
}
val androidMain by getting {
dependencies {
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
}
}
}
}
- Оптимизация процесса сборки
Компилятор Kotlin генерирует отдельные артефакты для каждого source set, что позволяет:
- Переиспользовать общую логику без дублирования
- Минимизировать размер конечных бинарных файлов
- Ускорить инкрементальные сборки
Иерархия source set в типичном KMP-проекте
commonMain
├── androidMain
│ └── androidUnitTest
├── iosMain
│ ├── iosArm64Main
│ ├── iosX64Main
│ └── iosSimulatorArm64Main
└── desktopMain
├── linuxMain
├── macosMain
└── windowsMain
Важные особенности:
- Наследование зависимостей: дочерние source set автоматически получают зависимости родительских
expect/actualмеханизм: позволяет объявлять ожидаемые декларации в общем коде и предоставлять фактические реализации в платформенных source set- Поддержка платформенных библиотек через
actualреализации
Практические сценарии использования
-
Разделение UI-логики
// commonMain expect fun showMessage(text: String) // androidMain actual fun showMessage(text: String) { Toast.makeText(context, text, Toast.LENGTH_SHORT).show() } // iosMain actual fun showMessage(text: String) { // Использование iOS API для отображения уведомления } -
Гранулярный контроль над кодом для разных устройств Можно создавать source set для конкретных типов устройств (iPhone vs iPad, телефон vs планшет)
-
Условная компиляция
// Файл в commonMain с условными директивами @OptIn(ExperimentalMultiplatform::class) @OptionalExpectation expect annotation class Parcelize() // Только в androidMain будет доступна реальная реализация actual typealias Parcelize = kotlinx.parcelize.Parcelize
Преимущества подхода
- Снижение дублирования кода: Общая бизнес-логика пишется один раз
- Улучшение поддерживаемости: Изменения в общей логике автоматически применяются ко всем платформам
- Постепенная миграция: Можно переносить код в общий source set поэтапно
- Гибкость тестирования: Отдельные source set для тестов с платформенно-специфичными mocking-фреймворками
Source set — это не просто организационная единица, а мощный инструмент архитектурного проектирования в Kotlin Multiplatform, который обеспечивает баланс между кодом общего назначения и платформенно-специфичными реализациями, делая кросс-платформенную разработку структурированной и эффективной.