Введение и проблематика
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
| Часть | Изменение | Пример |
|---|
| MAJOR | Breaking changes | 1.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 и зачем его коммитить?
{
"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
Удаление пакета
- Выберите проект в Project Navigator
- Перейдите на вкладку
Package Dependencies
- Выберите пакет и нажмите
-
Сброс кеша пакетов
Если возникают проблемы с пакетами:
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 приложения
Использовать в коде
import Alamofire
AF.request("https://api.example.com/users")
.responseDecodable(of: [User].self) { response in
print(response.value)
}
Плюсы и минусы
| Аспект | SPM | CocoaPods | Carthage |
|---|
| Интеграция с 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 вместо основного приложения.
Источники