Генерация проектов Xcode
Xcode
очень чувствителен к служебным файлам проекта, хранящимся в каталогах .xcworkspace
и .xcodeproj
. Для индивидуального разработчика, работающего на одной машине, это не является особой проблемой. Но я
ещё раз напомню — мы говорим о работе в команде. Именно поэтому нам важно добиться прозрачной переносимости проекта и
воспроизводимости сборки на всех машинах разработчиков и узлах CI
.
Основная проблема командной работы над iOS
-приложениями кроется в конфликтах при слиянии веток.
И если конфликты в исходном коде разрешить относительно легко, то конфликты в служебных файлах всегда вгоняют
разработчиков в уныние. Чтобы избежать таких проблем, прибегают к использованию генераторов проектов, а сами служебные
файлы исключают из-под контроля версий.
В самом простом случае в ваш .gitignore
добавятся две строки:
*.xcodeproj
*.xcworkspace
На данный момент существует два актуальных и широко известных решения для кодогенерации проектов Xcode
:
XcodeGen
XcodeGen
— инструмент декларативной генерации проектов на основе yaml
-спецификации. Он вполне соответствует
философии Unix
и хорошо выполняет ровно одну вещь — генерацию проекта.
Как и всегда, при выборе инструмента нужно смотреть глубже туториалов и пробовать его в реальных задачах.
Описать проект с помощью yaml
на деле оказывается довольно сложной задачей. Спецификация разбросана по md
-файлам в
репозитории проекта, а комментарии к полям не всегда понятны и требуют дополнительного разбора.
Даже простой проект, состоящий из одного экрана с первой попытки и без ошибок описать довольно сложно.
В целом, по опыту эксплуатации, я бы не спешил отдавать предпочтение XcodeGen
.
Tuist
Tuist
даёт большую гибкость, описывая структуру проекта на языке Swift
. Помимо генерации проекта, Tuist
предоставляет интерфейс командной строки к:
- запуску сборки,
- запуску тестов,
- миграции уже существующего проекта на
Tuist
, - созданию собственных плагинов и
- скаффолдингу микрофич, о которых мы поговорим в заметках об архитектуре.
Tuist
значительно более гибкий инструмент, чем XcodeGen
.
И в общем случае, я бы предпочёл использовать именно его.
Однако позвольте вас предостеречь. На момент написания данного поста документация Tuist
активно перерабатывается.
Также изменился и внутренний API
описания проектов. Шаблоны из коробки будут подсвечиваться желтым, поскольку многие
методы отмечены как deprecated
. Это потребует от вас умения нырять в исходники и разбираться с issue на github.
Но всё это не делает инструмент непригодным для использования, а только подчёркивает активную работу команды над ним.
Примеры кода
Лучше один раз запустить, чем сто раз прочитать. Для этого блога я создал группу в gitlab:
и выложил примеры простых приложений с использованием генерации проектов через XcodeGen
и Tuist
:
https://gitlab.com/towards-head-of-mobile-engineering/showcase/xcode-project-generation
В примерах существенно упрощена структура проекта, который содержит всего лишь одну цель сборки. Это сделано исключительно для наглядности.