Генерация проектов 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
В примерах существенно упрощена структура проекта, который содержит всего лишь одну цель сборки. Это сделано исключительно для наглядности.