iOS Mobile Инженер

iOS Mobile Инженер

Роадмап навыков для прокачки

Добавление SPM dependency через Xcode UI

iOS Tooling and DeliveryDependency ManagementSwift Package Manager

Основная идея

Swift Package Manager (SPM) — официальный менеджер зависимостей от Apple, интегрированный в Xcode. Добавление пакета через UI — самый простой способ подключить внешнюю библиотеку к проекту.

Ключевые аспекты

  • Package URL — ссылка на Git-репозиторий пакета (GitHub, GitLab и др.)
  • Version Rules — правила версионирования (Exact, Up to Next Major, Branch, Commit)
  • Target — к какому target проекта подключить пакет
  • Package.resolved — файл с зафиксированными версиями зависимостей

Плюсы SPM

  • Встроен в Xcode — не нужно устанавливать дополнительные инструменты
  • Работает с Swift и Objective-C
  • Автоматическое обновление через Xcode
  • Не требует CocoaPods или Carthage

Минусы

  • Не все библиотеки поддерживают SPM
  • Первичная загрузка может быть медленной
  • Меньше контроля над кешированием

Частые ошибки на собеседованиях

  • Путают Package URL с обычной ссылкой на репозиторий
  • Не понимают разницу между версионными правилами
  • Не знают про Package.resolved и его роль в CI/CD

Введение и проблематика

Swift Package Manager (SPM) — официальный менеджер зависимостей от Apple, появившийся в Swift 3 и полностью интегрированный в Xcode начиная с версии 11. SPM решает проблему подключения внешних библиотек без необходимости использовать сторонние инструменты.

SPM использует Git для управления версиями пакетов. Каждый пакет — это Git-репозиторий с файлом Package.swift.

Зачем нужен SPM

  • Подключение готовых библиотек (сетевые клиенты, UI-компоненты, утилиты)
  • Модульная архитектура собственного кода
  • Шаринг кода между проектами
  • Воспроизводимые сборки с фиксированными версиями

Добавление пакета через Xcode UI

Шаг 1: Открыть меню добавления пакета

В Xcode перейдите в File → Add Package Dependencies... (или File → Add Packages... в старых версиях).

Шаг 2: Ввести URL репозитория

В поле поиска введите URL Git-репозитория пакета. Например:

Шаг 3: Выбрать правило версионирования

Xcode предложит несколько вариантов:

  • Up to Next Major Version — обновляется до следующего мажорного релиза (рекомендуется)
  • Up to Next Minor Version — обновляется только минорные версии
  • Exact Version — фиксированная версия
  • Branch — конкретная ветка репозитория
  • Commit — конкретный коммит

Шаг 4: Выбрать target

Укажите, к какому target вашего проекта нужно добавить зависимость. Обычно это основной target приложения.

Шаг 5: Дождаться загрузки

Xcode скачает пакет и его зависимости. Прогресс виден в верхней части окна.


Правила версионирования

Semantic Versioning (SemVer)

SPM использует семантическое версионирование: MAJOR.MINOR.PATCH

ЧастьИзменениеПример
MAJORBreaking changes1.0.0 → 2.0.0
MINORНовые функции, совместимые1.0.0 → 1.1.0
PATCHБагфиксы1.0.0 → 1.0.1
⚠️

Up to Next Major — самый безопасный выбор. Получаете обновления и багфиксы, но без breaking changes.

Когда использовать какое правило

ПравилоКогда использовать
Up to Next MajorСтабильные библиотеки в продакшене
Up to Next MinorКогда нужна стабильность API
ExactКритичные зависимости, CI/CD
BranchТестирование новых функций
CommitОтладка конкретной версии

Package.resolved

После добавления пакета Xcode создаёт файл Package.resolved (или Package.resolved внутри .xcodeproj). Этот файл содержит точные версии всех зависимостей.

Code Example 1: Что хранится в Package.resolved и зачем его коммитить?

json
{
  "pins": [
    {
      "identity": "alamofire",
      "kind": "remoteSourceControl",
      "location": "https://github.com/Alamofire/Alamofire.git",
      "state": {
        "revision": "f455c2975872ccd2d9c81594c658af65716e9b9a",
        "version": "5.9.1"
      }
    }
  ]
}

Зачем коммитить Package.resolved

  • Все разработчики используют одинаковые версии
  • CI/CD воспроизводит идентичные сборки
  • Явная история изменений зависимостей

Управление пакетами

Просмотр установленных пакетов

В Project Navigator (Cmd + 1) внизу появится раздел Package Dependencies со списком всех пакетов.

Обновление пакетов

File → Packages → Update to Latest Package Versions

Удаление пакета

  1. Выберите проект в Project Navigator
  2. Перейдите на вкладку Package Dependencies
  3. Выберите пакет и нажмите -

Сброс кеша пакетов

Если возникают проблемы с пакетами: File → Packages → Reset Package Caches


Пограничные кейсы

🚫

Если Xcode не находит пакет по URL — проверьте правильность ссылки и доступность репозитория. Приватные репозитории требуют настройки SSH или Personal Access Token.

Конфликты версий

Если два пакета требуют разные версии одной зависимости, Xcode попытается найти совместимую версию. При невозможности — отобразит ошибку.

Приватные репозитории

Для приватных репозиториев настройте доступ:

  • SSH: добавьте SSH-ключ в Xcode (Xcode → Preferences → Accounts)
  • HTTPS: используйте Personal Access Token в URL

Пример: добавление Alamofire

Открыть Add Packages

File → Add Package Dependencies...

Ввести URL

https://github.com/Alamofire/Alamofire.git

Выбрать версию

Up to Next Major Version: 5.0.0

Выбрать target

Отметить галочкой ваш основной target приложения

Использовать в коде

swift
import Alamofire
 
AF.request("https://api.example.com/users")
    .responseDecodable(of: [User].self) { response in
        print(response.value)
    }

Плюсы и минусы

АспектSPMCocoaPodsCarthage
Интеграция с Xcode✅ Встроен❌ Требует pod install❌ Требует ручную настройку
Настройка✅ Минимальная⚠️ Podfile⚠️ Cartfile
Скорость⚠️ Средняя⚠️ Средняя✅ Быстрая (prebuilt)
Поддержка библиотек⚠️ Растёт✅ Максимальная⚠️ Средняя

Вопросы интервьюера

Q: Где хранятся загруженные пакеты?

В ~/Library/Developer/Xcode/DerivedData/[Project]/SourcePackages/

Q: Что делать, если пакет не обновляется?

File → Packages → Reset Package Caches, затем Update to Latest Package Versions.

Q: Можно ли использовать SPM в Objective-C проектах?

Да, SPM работает с Objective-C. Нужно импортировать модуль через @import PackageName;

Q: Как добавить пакет только для тестов?

При добавлении пакета выберите только Test target вместо основного приложения.


Источники

Code Example 1: Package.resolved

❓ Что хранится в Package.resolved и зачем его коммитить в репозиторий?

json
{
  "pins": [
    {
      "identity": "alamofire",
      "kind": "remoteSourceControl",
      "location": "https://github.com/Alamofire/Alamofire.git",
      "state": {
        "revision": "f455c2975872ccd2d9c81594c658af65716e9b9a",
        "version": "5.9.1"
      }
    }
  ]
}