Перейти к содержимому

Миграция Swift-пакета

Swift Package Manager появился как менеджер зависимостей для Swift-кода, который со временем непреднамеренно стал решать задачи управления проектами и поддержки других языков программирования, таких как Objective-C. Поскольку инструмент создавался с другой целью, его использование для управления крупными проектами может быть затруднено, потому что ему не хватает гибкости, производительности и возможностей, которые предоставляет Tuist. Это хорошо отражено в статье Scaling iOS at Bumble, где приведена таблица, сравнивающая производительность Swift Package Manager и нативных Xcode-проектов:

A table that compares the regression in performance when using SPM over native Xcode projects

Мы часто сталкиваемся с разработчиками и организациями, которые оспаривают необходимость использования Tuist, полагая, что Swift Package Manager может выполнять аналогичную роль в управлении проектами. Некоторые решаются на переход и позже осознают, что их опыт разработки значительно ухудшился. Например, переиндексация файла после его переименования может занять до 15 секунд. 15 секунд!

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

Spm Как Просто Менеджер Зависимостей

Tuist рассматривает Swift Package Manager как менеджер зависимостей, и это отличный менеджер. Мы используем его для разрешения и сборки зависимостей. Мы не используем его для определения проектов, потому что он не предназначен для этого.

Миграция с Swift Package Manager на Tuist#

Сходство между Swift Package Manager и Tuist упрощает процесс миграции. Основное различие заключается в том, что вместо Package.swift вы будете описывать свои проекты с помощью DSL Tuist.

Сначала создайте файл Project.swift рядом с файлом Package.swift. Файл Package.swift будет содержать описание вашего проекта. Ниже приведён пример файла Package.swift, в котором определяется проект с единственной целью:

swift
import ProjectDescription
let project = Project(
name: "App",
targets: [
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "dev.tuist.App",
sources: ["Sources/**/*.swift"]*
),
]
)

Некоторые моменты, на которые следует обратить внимание:

  • ProjectDescription: Вместо PackageDescription, вы будете использовать ProjectDescription.
  • Project: вместо экспорта экземпляра package вы будете использовать экземпляр project.
  • Язык Xcode: Примитивы, используемые для определения проекта, повторяют язык Xcode, поэтому вы найдете схемы, цели и этапы сборки, среди прочего.

Затем создайте файл Tuist.swift со следующим содержимым:

swift
import ProjectDescription
let tuist = Tuist()

Файл Tuist.swift содержит конфигурацию вашего проекта, а путь к нему служит ссылкой для определения корня проекта. Подробнее о структуре проектов Tuist можно узнать в документе directory structure.

Редактирование проекта#

Вы можете использовать команду tuist edit для редактирования проекта в Xcode. Эта команда сгенерирует проект Xcode, который можно открыть и начать с ним работу.

bash
tuist edit

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