Генерация проектов Xcode

Xcode очень чувствителен к служебным файлам проекта, хранящимся в каталогах .xcworkspace и .xcodeproj. Для индивидуального разработчика, работающего на одной машине, это не является особой проблемой. Но я ещё раз напомню — мы говорим о работе в команде. Именно поэтому нам важно добиться прозрачной переносимости проекта и воспроизводимости сборки на всех машинах разработчиков и узлах CI.

Основная проблема командной работы над iOS-приложениями кроется в конфликтах при слиянии веток. И если конфликты в исходном коде разрешить относительно легко, то конфликты в служебных файлах всегда вгоняют разработчиков в уныние. Чтобы избежать таких проблем, прибегают к использованию генераторов проектов, а сами служебные файлы исключают из-под контроля версий.

В самом простом случае в ваш .gitignore добавятся две строки:

*.xcodeproj
*.xcworkspace

На данный момент существует два актуальных и широко известных решения для кодогенерации проектов Xcode:

  • XcodeGen1
  • Tuist2

XcodeGen

XcodeGen — инструмент декларативной генерации проектов на основе yaml-спецификации. Он вполне соответствует философии Unix и хорошо выполняет ровно одну вещь — генерацию проекта.

Как и всегда, при выборе инструмента нужно смотреть глубже туториалов и пробовать его в реальных задачах.

Описать проект с помощью yaml на деле оказывается довольно сложной задачей. Спецификация разбросана по md-файлам в репозитории проекта, а комментарии к полям не всегда понятны и требуют дополнительного разбора.

Даже простой проект, состоящий из одного экрана с первой попытки и без ошибок описать довольно сложно.

В целом, по опыту эксплуатации, я бы не спешил отдавать предпочтение XcodeGen.

Tuist

Tuist даёт большую гибкость, описывая структуру проекта на языке Swift. Помимо генерации проекта, Tuist предоставляет интерфейс командной строки к:

  • запуску сборки,
  • запуску тестов,
  • миграции уже существующего проекта на Tuist,
  • созданию собственных плагинов и
  • скаффолдингу микрофич, о которых мы поговорим в заметках об архитектуре.

Tuist значительно более гибкий инструмент, чем XcodeGen. И в общем случае, я бы предпочёл использовать именно его.

Однако позвольте вас предостеречь. На момент написания данного поста документация Tuist активно перерабатывается. Также изменился и внутренний API описания проектов. Шаблоны из коробки будут подсвечиваться желтым, поскольку многие методы отмечены как deprecated. Это потребует от вас умения нырять в исходники и разбираться с issue на github.

Но всё это не делает инструмент непригодным для использования, а только подчёркивает активную работу команды над ним.

Примеры кода

Лучше один раз запустить, чем сто раз прочитать. Для этого блога я создал группу в gitlab:

https://gitlab.com/towards-head-of-mobile-engineering

и выложил примеры простых приложений с использованием генерации проектов через XcodeGen и Tuist:

https://gitlab.com/towards-head-of-mobile-engineering/showcase/xcode-project-generation

В примерах существенно упрощена структура проекта, который содержит всего лишь одну цель сборки. Это сделано исключительно для наглядности.