Spec-Zone.ru › Kotlin 2

Настройка экспорта Swift-пакета

Вы можете настроить вывод Kotlin/Native для целевой платформы Apple так, чтобы его можно было использовать в качестве зависимости Swift Package Manager (SwiftPM).

Рассмотрим проект Kotlin Multiplatform с целевой платформой iOS. Возможно, вы захотите сделать этот бинарный файл iOS доступным в качестве зависимости для разработчиков iOS, работающих над нативными проектами Swift. С помощью инструментов Kotlin Multiplatform вы можете предоставить артефакт, который легко интегрируется в проекты Xcode.

В этом руководстве показано, как это сделать, собрав XCFrameworks с помощью плагина Kotlin Gradle.

Настройка удалённой интеграции

Чтобы сделать ваш фреймворк доступным для использования, необходимо загрузить два файла:

  • ZIP-архив с XCFramework. Его нужно загрузить в удобное файловое хранилище с прямым доступом (например, создать релиз на GitHub и прикрепить архив, использовать Amazon S3 или Maven). Выберите вариант, который проще всего встроить в ваш рабочий процесс.

  • Файл Package.swift с описанием пакета. Его нужно отправить в отдельный репозиторий Git.

Варианты конфигурации проекта

В этом руководстве XCFramework хранится в виде бинарного файла в выбранном вами файловом хранилище, а файл Package.swift — в отдельном репозитории Git.

Однако вы можете настроить проект иначе. Рассмотрите следующие варианты организации репозиториев Git:

  • Храните файл Package.swift и код, который нужно упаковать в XCFramework, в отдельных репозиториях Git. Это позволяет управлять версиями манифеста Swift отдельно от версий проекта, описываемого этим файлом. Это рекомендуемый подход: он упрощает масштабирование и обычно облегчает сопровождение.

  • Поместите файл Package.swift рядом с кодом Kotlin Multiplatform. Это более простой подход, однако имейте в виду, что в этом случае версии Swift-пакета и кода будут совпадать. SwiftPM использует теги Git для управления версиями пакетов, что может привести к конфликтам с тегами проекта.

  • Храните файл Package.swift в репозитории проекта-потребителя. Это поможет избежать проблем с версиями и сопровождением. Однако такой подход может вызвать проблемы при настройке SwiftPM с несколькими репозиториями в проекте-потребителе и при дальнейшей автоматизации:

    • В проекте с несколькими пакетами только один пакет-потребитель может зависеть от внешнего модуля (чтобы избежать конфликтов зависимостей внутри проекта). Поэтому всю логику, зависящую от вашего модуля Kotlin Multiplatform, следует инкапсулировать в определённом пакете-потребителе.

    • Если вы публикуете проект Kotlin Multiplatform с помощью автоматизированного процесса CI, этот процесс должен также включать публикацию обновлённого файла Package.swift в репозиторий потребителя. Это может привести к конфликтующим обновлениям репозитория потребителя, поэтому такой этап CI может быть сложно сопровождать.

Настройка проекта Multiplatform

В следующем примере общий код проекта Kotlin Multiplatform хранится локально в модуле shared. Если структура вашего проекта отличается, замените "shared" в примерах кода и путей на имя вашего модуля.

Чтобы настроить публикацию XCFramework:

  1. Обновите файл конфигурации shared/build.gradle.kts, добавив вызов XCFramework в список целевых платформ iOS:

    import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework
    
    kotlin {
        // Other Kotlin Multiplatform targets
        // ...
        // Name of the module to be imported in the consumer project
        val xcframeworkName = "Shared"
        val xcf = XCFramework(xcframeworkName)
    
        listOf(
            iosArm64(),
            iosSimulatorArm64(),
        ).forEach { 
            it.binaries.framework {
                baseName = xcframeworkName
    
                // Specify CFBundleIdentifier to uniquely identify the framework
                binaryOption("bundleId", "org.example.${xcframeworkName}")
                xcf.add(this)
                isStatic = true
            }
        }
        //...
    }
    
  2. Запустите задачу Gradle, чтобы создать фреймворк:

    ./gradlew :shared:assembleSharedXCFramework
    

    Созданный фреймворк будет находиться в папке shared/build/XCFrameworks/release/Shared.xcframework в каталоге проекта.

    Если ваш проект использует зависимости SwiftPM, начиная с Kotlin 2.4.20-RC3 задача также создаёт рядом с XCFramework набор файлов, связанных со SwiftPM. Как описано ниже, вы можете распространять созданный файл Package.swift вместе с фреймворком, не создавая манифест с нуля.

  3. Если у вас есть несколько модулей с общим кодом, которые вы хотите экспортировать (например, модуль общей логики и модуль общего пользовательского интерфейса), объедините их в один новый модуль и распространяйте вместо них этот модуль-обёртку.

Подготовка XCFramework и манифеста Swift-пакета

  1. Сожмите папку Shared.xcframework в ZIP-файл и вычислите контрольную сумму полученного архива, например:

    swift package compute-checksum Shared.xcframework.zip

  2. Загрузите ZIP-файл в выбранное вами файловое хранилище. Файл должен быть доступен по прямой ссылке. Например, вот как это можно сделать с помощью релизов на GitHub:

    Загрузка в релиз GitHub
    1. Перейдите на GitHub и войдите в свою учётную запись.

    2. Перейдите в репозиторий, где хотите создать релиз.

    3. В разделе Релизы справа нажмите ссылку Создать новый релиз.

    4. Заполните сведения о релизе, добавьте или создайте новый тег, укажите заголовок релиза и напишите описание.

    5. Загрузите ZIP-файл с XCFramework с помощью поля Прикрепите бинарные файлы, перетащив их сюда или выбрав внизу:

      Fill in the release information
    6. Нажмите Опубликовать релиз.

    7. В разделе Ресурсы релиза щёлкните правой кнопкой мыши ZIP-файл и выберите Копировать адрес ссылки или аналогичный пункт в браузере:

      Copy the link to the uploaded file
  3. [Рекомендуется] Проверьте, что ссылка работает и файл можно скачать. В терминале выполните следующую команду:

    curl <downloadable link to the uploaded XCFramework ZIP file>
    
  4. Если ваш проект использует зависимости SwiftPM, начиная с Kotlin 2.4.20-RC3 задача Gradle assembleSharedXCFramework создаёт файл Package.swift рядом с XCFramework.

    Если это не так, вы можете создать файл Package.swift вручную по следующему шаблону:

    // swift-tools-version:5.3
    import PackageDescription
    
    let package = Package(
       name: "Shared",
       platforms: [
         .iOS(.v14),
       ],
       products: [
          .library(name: "Shared", targets: ["Shared"])
       ],
       targets: [
          .binaryTarget(
             name: "Shared",
             url: "<link to the uploaded XCFramework ZIP file>",
             checksum:"<checksum calculated for the ZIP file>")
       ]
    )
    
  5. Укажите недостающие поля:

    • В поле url укажите ссылку на ZIP-архив с XCFramework.

    • В поле checksum укажите контрольную сумму, ранее вычисленную для ZIP-файла.

  6. [Рекомендуется] Чтобы проверить полученный манифест, выполните следующую команду оболочки в каталоге с файлом Package.swift:

    swift package reset && swift package show-dependencies --format json
    

    В выводе будут описаны обнаруженные ошибки или показан результат успешной загрузки и разбора, если манифест корректен.

  7. Отправьте файл Package.swift в удалённый репозиторий. Не забудьте создать и отправить тег Git с семантической версией пакета.

Добавление зависимости от пакета

Теперь, когда оба файла доступны, вы можете добавить зависимость от созданного пакета в существующий клиентский проект iOS или создать новый проект. Чтобы добавить зависимость от пакета:

  1. В Xcode выберите Файл | Добавить зависимости пакета.

  2. В поле поиска введите URL репозитория Git, содержащего файл Package.swift:

    Specify repo with the package file
  3. Нажмите кнопку Добавить пакет, затем выберите продукты и соответствующие целевые платформы для пакета.

    Если вы создаёте Swift-пакет, диалоговое окно будет другим. В этом случае нажмите кнопку Копировать пакет. Строка .package будет скопирована в буфер обмена. Вставьте эту строку в блок Package.Dependency собственного файла Package.swift и добавьте необходимый продукт в соответствующий блок Target.Dependency.

Проверка настройки

Чтобы проверить, что всё настроено правильно, проверьте импорт в Xcode:

  1. В проекте перейдите к файлу представления пользовательского интерфейса, например ContentView.swift.

  2. Замените код следующим фрагментом:

    import SwiftUI
    import Shared
    
    struct ContentView: View {
        var body: some View {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
                Text("Hello, world! \(Shared.Platform_iosKt.getPlatform().name)")
            }
            .padding()
        }
    }
    
    #Preview {
        ContentView()
    }
    

    Здесь вы импортируете XCFramework Shared, а затем используете его, чтобы получить название платформы из поля Text.

  3. Убедитесь, что предварительный просмотр обновился и отображает новый текст.

Экспорт нескольких модулей в виде XCFramework

Чтобы сделать код из нескольких модулей Kotlin Multiplatform доступным в виде бинарного файла iOS, объедините эти модули в один модуль-обёртку. Затем соберите и экспортируйте XCFramework этого модуля-обёртки.

Например, у вас есть модуль network и модуль database, которые вы объединяете в модуль together:

  1. Укажите зависимости и конфигурацию фреймворка в файле together/build.gradle.kts:

    kotlin {
        val frameworkName = "together"
        val xcf = XCFramework(frameworkName)
    
        listOf(
            iosArm64(),
            iosSimulatorArm64()
        ).forEach { iosTarget ->
            // Same as in the example above,
            // with added export calls for dependencies
            iosTarget.binaries.framework {
                export(projects.network)
                export(projects.database)
    
                baseName = frameworkName
                xcf.add(this)
            }
        }
    
        // Dependencies set as "api" (as opposed to "implementation") to export underlying modules
        sourceSets {
            commonMain.dependencies {
                api(projects.network)
                api(projects.database)
            }
        }
    }
    
  2. Для каждого включённого модуля необходимо настроить целевые платформы iOS, например:

    kotlin {
        android {
            //...
        }
    
        iosArm64()
        iosSimulatorArm64()
    
        //...
    }
    
  3. Создайте пустой файл Kotlin в папке together, например together/src/commonMain/kotlin/Together.kt. Это обходное решение, поскольку в настоящее время скрипт Gradle не может собрать фреймворк, если экспортируемый модуль не содержит исходного кода.

  4. Запустите задачу Gradle, которая собирает фреймворк:

    ./gradlew :together:assembleTogetherReleaseXCFramework
    
  5. Выполните действия из предыдущего раздела, чтобы подготовить together.xcframework: создайте архив, вычислите контрольную сумму, загрузите архив XCFramework в файловое хранилище, создайте файл Package.swift и отправьте его.

Теперь вы можете импортировать зависимость в проект Xcode. После добавления директивы import together классы из обоих модулей — network и database — будут доступны для импорта в коде Swift.

21 июля 2026
Прямая интеграцияДобавление Swift-пакетов в качестве зависимостей модулей KMP

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/multiplatform-spm-export.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API