Попрощайтесь с CocoaPods

Есть несколько способов распространения библиотек Swift среди интеграторов, среди которых CocoaPods - один из самых популярных. До недавнего времени используемые инструменты создавались и поддерживались сообществом разработчиков ПО с открытым исходным кодом. В Swift 3 Apple сообщество Swift было представлено Swift Package Manager.

В этой статье мы расскажем, почему вам следует поддерживать Swift Package Manager. Затем мы рассмотрим, как распространять и использовать статические библиотеки с помощью Swift Package Manager в приложении для iOS.

Я предполагаю, что читатель уже знаком со статическими библиотеками Swift, Swift и Xcode. Я также предполагаю, что читатель знаком с системой управления версиями Git и GitHub.

Для этой статьи я использовал Swift 5.2 и Xcode 11.4.1.

Почему вы должны публиковать свою библиотеку в виде пакета Swift

Существуют менеджеры зависимостей / пакетов, уже поддерживаемые сообществом разработчиков ПО с открытым исходным кодом, так зачем нам еще один?

Во-первых, существующие инструменты необходимо загружать, поддерживать и устанавливать отдельно. Swift Package Manager входит в состав Swift и Xcode. Это означает, что дополнительная установка не требуется.

Во-вторых, как и популярные сторонние инструменты, Swift Package Manager является открытым. Однако большинство сторонних инструментов используют языки, отличные от Swift. Swift Package Manager написан на Swift. Написание на Swift упрощает для разработчика Swift чтение, понимание и, возможно, даже участие в проекте.

В-третьих, Swift Package Manager поддерживается пользовательским интерфейсом Xcode. Это означает, что мы можем выполнять большинство операций, даже не покидая Xcode. Другие инструменты не имеют встроенной интеграции с пользовательским интерфейсом Xcode.

Наконец, Apple поддерживает Swift Package Manager. В прошлом в новых версиях Xcode иногда нарушалась интеграция сторонних инструментов. Это означало, что либо вы не смогли выполнить обновление до последней версии Xcode, либо вам пришлось избавиться от сторонних инструментов, которые больше не были совместимы. Поскольку Swift Package Manager поддерживается Apple, инструмент имеет меньший риск взлома с более новыми версиями Xcode.

Таким образом, Swift Package Manager:

  • Не требует дополнительной загрузки, установки и обслуживания стороннего инструмента.
  • Облегчает участие в проекте
  • Позволяет запускать инструмент, не выходя из Xcode
  • Поддерживается Apple

Как опубликовать статическую библиотеку в Swift Package Manager

В этом разделе мы опубликуем существующую статическую библиотеку iOS как пакет Swift. Для публикации пакетов для этого раздела требуется учетная запись GitHub.

В этом разделе мы:

  1. Получить стартовый проект
  2. Создать декларацию пакета
  3. Создайте локальный репозиторий Git
  4. Создайте учетную запись GitHub
  5. Опубликовать на GitHub

1. Получить начальный проект.

Сначала загрузим стартовый проект. Откройте терминал и выполните следующие команды:

cd $HOME
curl https://github.com/anuragajwani/distributing_swift_lib_spm/archive/starter.zip -o swift_lib.zip -L -s
unzip -q swift_lib.zip
cd distributing_swift_lib_spm-starter/MyStaticLib

Начальный проект содержит статическую библиотеку Swift с одним файлом и функцией. Функциональность библиотеки не важна для этой статьи.

2. Создайте декларацию пакета.

Затем давайте сделаем нашу библиотеку пакетом Swift. В Xcode есть удобная возможность легко создать новый пакет. Однако в Xcode нет удобной возможности превратить существующую библиотеку в пакет. Мы будем создавать декларацию пакета с нуля.

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

touch Package.swift

Далее мы создадим спецификацию пакета. Выполните следующую команду:

Первая строка файла Package.swift (содержимое междуEOF) объявляет минимальную версию цепочки инструментов Swift, необходимую для использования этого пакета. На момент написания я использую Xcode 11.4.1, который включает версию 5.2.2 инструментальной цепочки Swift. Вы можете найти версию инструментальной цепочки, выполнив следующую команду:

swift --version

Вторая строка, import PackageDescription, объявляет об использовании Package framework. Это уже связано с Xcode и Swift.

Далее идет само объявление пакета.

Во-первых, это название самого пакета. Теперь давайте прикрываем цели. Цель охватывает набор создаваемых исходных файлов. Мы можем точно указать, какие источники нужно включить или исключить, или, если не указано, то все подходящие файлы по пути. В этом случае мы скомпилируем все исходные файлы в каталоге MyStaticLib.

Наконец, поговорим о продуктах. Мы декларируем продукты, которые будет составлять пакет. В настоящее время продукт может быть библиотекой или исполняемым файлом. В этой статье мы сосредоточимся только на библиотеке. Обратите внимание, что мы указали, что продукт MyStaticLib будет строить MyStaticLib цель. Вы можете создать продукт, состоящий из нескольких целей, но в этом случае у нас есть только одна цель.

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

И это все, что нужно для декларирования посылки.

3. Создайте локальный репозиторий Git.

Затем мы создадим локальный репозиторий Git для MyStaticLib. Нам это нужно как шаг к публикации нашего пакета в удаленном репозитории, который будет размещен в GitHub.

На этом этапе мы создадим локальный репозиторий Git через терминал. Откройте терминал и выполните следующие команды:

cd $HOME/distributing_swift_lib_spm-starter/MyStaticLib
git init
git add --all
git commit --message "Initial commit"

4. Настройте учетную запись GitHub.

Прежде чем продолжить, убедитесь, что у вас есть учетная запись GitHub. Кроме того, нам нужно будет добавить учетную запись GitHub в учетные записи Xcode. Чтобы связать учетную запись GitHub с Xcode, откройте Xcode и в меню выберите Xcode ›Настройки.

Затем перейдите на вкладку «Учетные записи». Затем нажмите значок плюса «+».

Когда будет предложено «Выберите тип учетной записи, которую вы хотите добавить», выберите GitHub и нажмите «Продолжить».

Затем вам понадобится личный токен доступа к вашей учетной записи GitHub. Чтобы создать его, выполните эти шаги. При создании токена личного доступа убедитесь, что вы проверили область репо.

Затем введите имя своей учетной записи и доступ к личному токену в строке «Войдите в свою учетную запись GitHub». Затем нажмите «Войти».

Теперь вы можете закрыть окно настроек.

5. Опубликуйте на GitHub.

Затем давайте опубликуем MyStaticLib на GitHub. Мы сделаем это через Xcode.

Во-первых, давайте откроем наш пакет Swift в Xcode. Откройте терминал и выполните следующую команду:

open ~/distributing_swift_lib_spm-starter/MyStaticLib/Package.swift

Затем давайте создадим репозиторий Git в GitHub. В меню выберите «Просмотр» ›« Навигаторы »› «Показать навигатор управления исходным кодом».

В области навигатора щелкните правой кнопкой мыши «MyStaticLib master», а затем выберите «Создать удаленный MyStaticLib».

Когда будет предложено «Создать« MyStaticLib »удаленно», вы можете выбрать, оставить ли этот репозиторий частным или общедоступным. В этой статье я выбираю частный, так как мы только демонстрируем, как публиковать и использовать пакеты Swift. Затем нажмите "Создать".

Пакеты Swift используют теги Git для получения нужной версии пакета Swift. Управление версиями пакетов Swift следует стандартам семантического управления версиями. Знание семантического управления версиями на данном этапе не требуется, так как мы опубликуем только одну версию.

Давайте создадим тег Git для нашей первой версии. Снова щелкните правой кнопкой мыши «MyStaticLib master» в области навигатора и выберите «Tag‘ master ».

При появлении запроса «Создать новый тег из ревизии» введите 1.0.0 в поле «Тег». Затем нажмите «Создать».

Тег теперь создается локально. Давайте отправим этот тег в удаленный репозиторий Git в GitHub. В меню выберите Source Control ›Push.

При появлении запроса «Отправить локальные изменения в» установите флажок «Включить теги». Затем нажмите Push.

Теперь тег доступен в нашем репозитории GitHub. MyStaticLib Пакет Swift уже доступен!

Как использовать опубликованную статическую библиотеку

В этом разделе мы узнаем, как использовать пакет Swift, который мы создали в предыдущем разделе.

В этом разделе мы:

  1. Создайте приложение для iOS, чтобы использовать MyStaticLib
  2. Добавьте MyStaticLib пакет Swift в приложение
  3. Потребляйте MyStaticLib

Давайте создадим приложение, которое будет использовать наш пакет Swift. Откройте Xcode и в меню выберите File ›New› Project.

При появлении запроса «Выберите шаблон для нового проекта» выберите «Приложение для одного просмотра» и нажмите «Далее».

Когда будет предложено «Выбрать параметры для вашего нового проекта», назовите свой продукт SwiftPackageDemo в поле «Название продукта». Все остальные параметры можно оставить как есть. Нажмите "Далее.

Сохраните его там, где считаете нужным. Щелкните "Создать".

Затем в меню выберите Файл ›Пакеты Swift› Добавить зависимость пакета.

Когда будет предложено «Выбрать репозиторий пакетов», выполните поиск и выберите MyStaticLib, владельцем которого вы являетесь. Нажмите "Далее.

Когда будет предложено «Выбрать опцию пакета», Xcode уже выберет для вас версию 1.0.0. Нажмите "Далее.

При появлении запроса «Добавить пакет в SwiftPackageDemo» убедитесь, что MyStaticLib установлен для приложения SwiftPackageDemo. Щелкните Готово.

MyStaticLib теперь добавлен как зависимость приложения SwiftPackageDemo.

Затем вы воспользуетесь кодом MyStaticLib в нашем приложении. Откройте AppDelegate.swift и после import UIKit добавьте следующую строку:

import MyStaticLib

Затем добавьте следующую строку к функции application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool перед return true:

functionA()

Наконец, запустите приложение в симуляторе.

Теперь вы должны увидеть, как функция статической библиотеки выводит сообщение на консоль. И это все!

Резюме

Из этой статьи вы узнали:

  • Почему вы должны публиковать свою библиотеку в виде пакета Swift
  • Как публиковать пакеты Swift
  • Как использовать пакеты Swift

Заключительные примечания

Вы можете найти полный исходный код этой статьи на GitHub.

В этой статье мы говорили о публикации статической библиотеки в виде пакета Swift. Однако как насчет динамических фреймворков Swift? Мы можем публиковать пакеты Swift как динамические библиотеки, просматривая документацию. Мы можем сделать это, изменив тип библиотеки. Однако сам я этого не пробовал.

Еще одно заслуживающее внимания ограничение Swift Package Manager заключается в том, что мы не можем публиковать динамические фреймворки. Какие последствия? Короче говоря, мы не можем объединять ресурсы, такие как изображения, XIB или файлы раскадровки.

Как насчет распространения скомпилированных статических библиотек или скомпилированных динамических фреймворков с помощью Swift Package Manager? Мы пока не можем этого сделать. Однако над этой функцией работают.

Таким образом, Swift Package Manager не может:

  • распределять ресурсы
  • создавать динамические фреймворки
  • распространять скомпилированные библиотеки