Структура Swift Package
Viktor Grushevskii (https://t.me/iOS_Career)
Создание package
Мы можем использовать Xcode, как вы уже догадались (в этом примере используется 13.3). После открытия Xcode нужно перейти File -> New -> Package:

После того, как мы выбрали эту опцию, должно открыться примерно такое окно:

Когда мы определимся с расположением и именем нашего пакета, мы можем нажать кнопку создать, и SPM создаст наш пакет Swift со структурой папок по умолчанию.
Структура разделов внутри

Наш package будет создан с такой структурой по умолчанию. Каждый файл и папка имеют своё назначение:
README.md: Описание пакета для пользователейPackage.swift: Файл манифеста, определяющий, что это за пакетSources: Папка, содержащая исходные файлыTests: Папка, содержащая тесты, покрывающие код из разделаSources
Файл манифеста
Каждый Swift package имеет манифест (названный Package.swift). Манифест содержит следующую важную информацию:
- Его имя.
- Поддерживаемые платформы.
- Цели, которые он содержит.
- Зависимости.
- Продукты, которые распространяются (библиотеки).

Посмотрим, какие элементы ещё находятся в Package:
Цели (targets)
Пакет разделён на таргеты. Они как строительные кирпичи для пакета. Каждый таргет имеет своё назначение и определяет модуль:

Цели имеют свою собственную папку в разделе Sources, содержащую их исходный код. Они также могут зависеть от внешнего кода или от других целей. Это позволяет нам при необходимости модулировать наш код.
Тестовые цели (test targets)
Мы можем написать автоматизированные тесты для каждой из целей. Всё, что нам нужно сделать — определить тестовую цель с соответствующей папкой и наборами тестов (обратите внимание, что наш Simple-Package используется как зависимость):

Продукты (products)
Модуль, определяемый целью, не доступен напрямую пользователям пакета. Он изначально является внутренним. Единственный способ распространить публичный API для цели — определить продукт с типом library. Он распространяет модуль, определенный его целью, позволяя использовать его публичный API через импорт:

Зависимости (dependencies)
Пакеты также могут ссылаться и на другие packages. Когда мы определяем зависимости, нужно указать и номера версий, которые нужны:

Сразу после того, как мы отредактируем наш манифест, SPM разрулит (разрешит) наши зависимости — абсолютно тот же самый процесс, который он делает и в обычном проекте Xcode:

После этого мы можем использовать любые продукты из подключенных swift-алгоритмов в наших целях (targets):

Workflow (рабочий процесс)
Workflow для пакетов Xcode очень похоже на наши обычные проекты (будь то iOS или MacOS).
Добавление файлов
Чтобы добавить файлы swift к цели, просто поместите их в ее папку. Этот файл будет принадлежать модулю в target, что означает, что мы можем добавить в него новый код и получить доступ к другому коду, уже определенному в нем.

Building and testing (сборка и тестирование)
Процесс сборки очень прост. Просто выберите product из списка. Я добавил несколько целей для того, чтобы это продемонстрировать:

Вот как будет выглядеть манифест в таком случае:

А вот так будет выглядеть структура проекта:

Заключение
Мы узнали, как создавать пакеты и как они выглядят с точки зрения структуры. Мы изучили, что такое манифесты и как их можно использовать для определения пакета. Мы также рассмотрели ключевые компоненты пакета:
- Dependencies.
- Targets.
- Products.
Если вы нашли что-то полезное для себя, то подписывайтесь на мой канал, тут больше интересных историй и подходов.
