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

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

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

Таблица, сравнивающая снижение производительности при использовании SPM вместо нативных проектов Xcode

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

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

SPM только как менеджер зависимостей

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

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

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

Сначала создайте файл Project.swift рядом с вашим файлом Package.swift. Файл Project.swift будет содержать определение вашего проекта. Вот пример файла Project.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 можно узнать в документе о структуре каталогов.

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

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

bash
tuist edit

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