← Назад к вопросам

Для чего нужен source set в Kotlin Multiplatform?

2.0 Middle🔥 131 комментариев
#Многомодульность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение source set в Kotlin Multiplatform

Source set (исходный набор) — это фундаментальная концепция Kotlin Multiplatform (KMP), представляющая логическую группу исходных кодов Kotlin с общими зависимостями, настройками компиляции и целевым окружением. Это абстракция над физической структурой каталогов, позволяющая эффективно организовать код для нескольких платформ.

Ключевые цели и функции source set

  1. Сегрегация платформенно-специфичного и общего кода 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"
}
  1. Управление зависимостями на уровне 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")
            }
        }
    }
}
  1. Оптимизация процесса сборки Компилятор Kotlin генерирует отдельные артефакты для каждого source set, что позволяет:
    • Переиспользовать общую логику без дублирования
    • Минимизировать размер конечных бинарных файлов
    • Ускорить инкрементальные сборки

Иерархия source set в типичном KMP-проекте

commonMain
├── androidMain
│   └── androidUnitTest
├── iosMain
│   ├── iosArm64Main
│   ├── iosX64Main
│   └── iosSimulatorArm64Main
└── desktopMain
    ├── linuxMain
    ├── macosMain
    └── windowsMain

Важные особенности:

  • Наследование зависимостей: дочерние source set автоматически получают зависимости родительских
  • expect/actual механизм: позволяет объявлять ожидаемые декларации в общем коде и предоставлять фактические реализации в платформенных source set
  • Поддержка платформенных библиотек через actual реализации

Практические сценарии использования

  1. Разделение 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 для отображения уведомления
    }
    
  2. Гранулярный контроль над кодом для разных устройств Можно создавать source set для конкретных типов устройств (iPhone vs iPad, телефон vs планшет)

  3. Условная компиляция

    // Файл в 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, который обеспечивает баланс между кодом общего назначения и платформенно-специфичными реализациями, делая кросс-платформенную разработку структурированной и эффективной.

Для чего нужен source set в Kotlin Multiplatform? | PrepBro