Swift Package Manager
Swift Package Manager (SPM) — это система управления зависимостями и автоматизации сборки, встроенная в язык программирования Swift. Разработана компанией Apple Inc. (организация признана экстремистской и запрещена в РФ?) для платформ Apple, а также для операционных систем Linux и Windows. SPM служит для распространения, интеграции и сборки библиотек и исполняемых модулей, написанных на Swift, и является официальным инструментом сообщества Swift для управления пакетами.
История
Разработка Swift Package Manager началась в 2015 году, после выхода Swift 2.0. Первая стабильная версия (Swift 3.0) была выпущена в сентябре 2016 года. Изначально SPM был ориентирован на серверные приложения и библиотеки, работающие под Linux, где отсутствовали традиционные инструменты Apple (Xcode). В 2019 году, с выходом Swift 5.0, SPM был интегрирован в Xcode 11, что позволило использовать его для разработки приложений под iOS, macOS, watchOS и tvOS. С тех пор SPM стал основным способом управления зависимостями в экосистеме Apple, постепенно вытесняя более старые инструменты, такие как CocoaPods и Carthage.
Архитектура и принцип работы
Пакет
Пакет в SPM — это директория, содержащая исходный код на Swift, файл манифеста Package.swift и, опционально, другие ресурсы (тесты, документацию, ресурсы). Пакет может быть библиотекой (библиотека Swift) или исполняемым файлом (исполняемый модуль).
Манифест Package.swift
Файл Package.swift является центральным элементом пакета. Он написан на языке Swift и содержит:
- Имя пакета (
name). - Платформы (
platforms) — минимальные версии ОС, которые поддерживает пакет. - Зависимости (
dependencies) — список других пакетов, от которых зависит данный пакет. Каждая зависимость указывается с URL репозитория и версией (или диапазоном версий). - Цели (
targets) — описание модулей, из которых состоит пакет. Цели могут быть: - Библиотека (
library) — статическая или динамическая. - Исполняемый файл (
executable) — приложение или утилита. - Тест (
test) — набор тестов для проверки кода. - Продукты (
products) — то, что пакет предоставляет другим пакетам (библиотеки или исполняемые файлы).
Пример упрощённого манифеста:
```swift // swift-tools-version:5.9 import PackageDescription
let package = Package( name: "MyLibrary", platforms: [.iOS(.v15), .macOS(.v12)], dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.0.0") ], targets: [ .target( name: "MyLibrary", dependencies: ["Alamofire"]), .testTarget( name: "MyLibraryTests", dependencies: ["MyLibrary"]) ] ) ```
Управление версиями
SPM использует семантическое версионирование (SemVer). Зависимости указываются с помощью:
from: "1.2.3"— версия >= 1.2.3 и < 2.0.0.exact: "1.2.3"— точная версия."1.2.3"..<"2.0.0"— диапазон.branch: "main"илиrevision: "abc123"— конкретная ветка или коммит (не рекомендуется для стабильных проектов).
При сборке SPM разрешает зависимости, создавая файл Package.resolved, который фиксирует точные версии всех используемых пакетов, что обеспечивает воспроизводимость сборок.
Сборка
SPM использует встроенную систему сборки Swift. Команда swift build компилирует все цели и зависимости, создавая исполняемые файлы или библиотеки в директории .build. SPM автоматически разрешает транзитивные зависимости (зависимости зависимостей) и проверяет их совместимость.
Основные команды
SPM предоставляет набор команд через утилиту swift:
swift package init— создаёт новый пакет с шаблонной структурой.swift build— собирает пакет и его зависимости.swift test— запускает тесты.swift run— запускает исполняемый файл пакета.swift package update— обновляет зависимости до последних версий в рамках указанных диапазонов.swift package resolve— разрешает зависимости и записывает их вPackage.resolved.swift package show-dependencies— отображает дерево зависимостей.
Интеграция с Xcode
Начиная с Xcode 11, SPM встроен в IDE. Разработчик может добавить пакет в проект через меню File → Add Packages..., указав URL репозитория. Xcode автоматически разрешает зависимости, загружает исходный код и включает его в проект. SPM-пакеты отображаются в навигаторе проекта как отдельные модули, и их можно обновлять через контекстное меню.
Преимущества и недостатки
Преимущества
- Интеграция с экосистемой Swift — не требует установки сторонних инструментов.
- Простота — манифест на Swift, минималистичный синтаксис.
- Скорость — быстрая загрузка и сборка, особенно при использовании кэширования.
- Безопасность — все зависимости загружаются из открытых репозиториев, нет централизованного реестра (хотя существует реестр Swift Package Index).
- Поддержка платформ — работает на macOS, Linux, Windows, а также на iOS, tvOS, watchOS через Xcode.
Недостатки
- Отсутствие централизованного реестра — поиск пакетов менее удобен, чем в CocoaPods или npm.
- Ограниченная поддержка ресурсов — до Swift 5.3 ресурсы (изображения, локализации) не поддерживались; в более поздних версиях поддержка появилась, но остаётся менее гибкой, чем в CocoaPods.
- Зависимость от Git — SPM требует, чтобы пакет был размещён в Git-репозитории.
- Сложности с закрытыми библиотеками — SPM не поддерживает бинарные зависимости (за исключением XCFramework) без дополнительных настроек.
Применение
SPM используется для:
- Разработки библиотек — публикация и распространение кода на Swift.
- Создания серверных приложений — в рамках фреймворка Vapor и других.
- Управления зависимостями в мобильных приложениях — замена CocoaPods и Carthage.
- Сборки утилит командной строки — например, SwiftLint, SwiftFormat.
- Автоматизации CI/CD — SPM легко интегрируется с системами непрерывной интеграции (GitHub Actions, GitLab CI, Jenkins).
Сравнение с другими менеджерами пакетов
| Характеристика | Swift Package Manager | CocoaPods | Carthage |
|---|---|---|---|
| Язык манифеста | Swift | Ruby | Swift (Cartfile) |
| Способ интеграции | Исходный код | Исходный код | Бинарные файлы |
| Централизованный реестр | Нет (есть Swift Package Index) | Да (CocoaPods Trunk) | Нет |
| Поддержка ресурсов | Да (с Swift 5.3) | Да | Нет |
| Интеграция с Xcode | Встроенная | Через плагин | Через скрипт |
| Скорость сборки | Высокая | Средняя | Высокая (только бинарники) |
| Поддержка Swift | Полная | Частичная | Полная |
Интересные факты
- SPM написан на Swift, что делает его одним из немногих менеджеров пакетов, написанных на том же языке, для которого он предназначен.
- С 2020 года Apple рекомендует использовать SPM в качестве основного инструмента управления зависимостями, а CocoaPods и Carthage считаются устаревшими.
- SPM поддерживает не только Swift, но и Objective-C, C и C++ (через модули).
- Пакеты SPM могут быть опубликованы в реестре Swift Package Index, который предоставляет поиск, документацию и анализ качества.
Критика
Основные критические замечания в адрес SPM касаются:
- Отсутствия централизованного реестра — что затрудняет поиск и проверку пакетов.
- Сложностей с версионированием — при использовании диапазонов версий возможны конфликты, которые трудно разрешить вручную.
- Ограниченной поддержки старых проектов — миграция с CocoaPods на SPM может быть трудоёмкой.
- Проблем с производительностью — при большом количестве зависимостей разрешение графа может быть медленным.
Тем не менее, SPM активно развивается, и многие из этих недостатков устраняются в новых версиях Swift.
Источники
- Apple Inc. (2023). Swift Package Manager Documentation. Swift.org.
- Apple Inc. (2023). Xcode Help: Adding Package Dependencies to Your App. developer.apple.com.
- Swift Package Index (2023). About Swift Package Index. swiftpackageindex.com.
- Vapor Team (2023). Vapor Documentation: Package Manager. docs.vapor.codes.
- GitHub (2023). Alamofire Package. github.com/Alamofire/Alamofire.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →