Сгенерированные проекты
Сгенерированные проекты Tuist — это жизнеспособная альтернатива, которая помогает преодолеть эти проблемы, сохраняя сложность и затраты на приемлемом уровне. Она рассматривает проекты Xcode как фундаментальный элемент, обеспечивая устойчивость к будущим обновлениям Xcode, и использует генерацию проектов Xcode для предоставления командам декларативного API, ориентированного на модуляризацию. Tuist использует объявление проекта, чтобы упростить сложности модуляризации, оптимизировать рабочие процессы, такие как сборка или тестирование, в различных средах, а также облегчить и демократизировать эволюцию проектов Xcode.
Как это работает?#
Чтобы начать работу со сгенерированными проектами, вам нужно лишь определить свой проект с помощью специализированного языка (DSL) Tuist. Это подразумевает использование файлов манифеста, таких как Workspace.swift или Project.swift. Если вы ранее работали со Swift Package Manager, подход будет очень похожим.
После определения проекта Tuist предлагает различные рабочие процессы для управления им и взаимодействия с ним:
- Генерация: Это базовый рабочий процесс. Используйте его для создания проекта Xcode, совместимого с Xcode.
- Сборка: Этот рабочий процесс не только генерирует проект Xcode, но и использует
xcodebuildдля его компиляции. - Тестирование: Работая аналогично процессу сборки, этот рабочий процесс не только генерирует проект Xcode, но и использует
xcodebuildдля его тестирования.
Проблемы с проектами Xcode#
По мере роста проектов Xcode организации могут столкнуться со снижением производительности из-за нескольких факторов, включая ненадежные инкрементальные сборки, частую очистку глобального кэша Xcode разработчиками при возникновении проблем и хрупкие конфигурации проектов. Для поддержания быстрой разработки функций организации обычно изучают различные стратегии.
Некоторые организации предпочитают обходить компилятор, абстрагируя платформу с помощью динамических сред выполнения на базе JavaScript, таких как React Native. Хотя этот подход может быть эффективным, он усложняет доступ к нативным возможностям платформы. Другие организации выбирают модуляризацию кодовой базы, что помогает установить четкие границы, упрощает работу с кодом и повышает надежность времени сборки. Однако формат проектов Xcode не предназначен для модульности и приводит к неявным конфигурациям, которые понимают немногие, и частым конфликтам. Это приводит к низкому показателю «bus factor», и хотя инкрементальные сборки могут улучшиться, разработчики все равно могут часто очищать кэш сборки Xcode (т. е. derived data) при сбоях сборки. Чтобы решить эту проблему, некоторые организации выбирают отказ от системы сборки Xcode и переходят на альтернативы, такие как Buck или Bazel. Однако это сопряжено с высокой сложностью и затратами на поддержку.
Альтернативы#
Swift Package Manager#
Хотя Swift Package Manager (SPM) в первую очередь ориентирован на зависимости, Tuist предлагает другой подход. С Tuist вы не просто определяете пакеты для интеграции с SPM; вы формируете свои проекты, используя знакомые концепции, такие как проекты, рабочие области, цели и схемы.
XcodeGen#
XcodeGen — это специализированный генератор проектов, предназначенный для уменьшения конфликтов в совместных проектах Xcode и упрощения некоторых сложностей внутренней работы Xcode. Однако проекты определяются с использованием сериализуемых форматов, таких как YAML. В отличие от Swift, это не позволяет разработчикам строить абстракции или проверки без подключения дополнительных инструментов. Хотя XcodeGen действительно предлагает способ сопоставления зависимостей с внутренним представлением для валидации и оптимизации, он все же подвергает разработчиков нюансам работы Xcode. Это может сделать XcodeGen подходящей основой для создания инструментов, как это наблюдается в сообществе Bazel, но он не оптимален для инклюзивной эволюции проектов, направленной на поддержание здоровой и продуктивной среды.
Bazel#
Bazel — это продвинутая система сборки, известная своими возможностями удаленного кэширования, набирающая популярность в сообществе Swift преимущественно благодаря этой возможности. Однако, учитывая ограниченную расширяемость Xcode и его системы сборки, замена ее на систему Bazel требует значительных усилий и затрат на поддержку. Лишь немногие компании с большими ресурсами могут нести такие издержки, что видно из ограниченного списка фирм, активно инвестирующих в интеграцию Bazel с Xcode. Примечательно, что сообщество создало инструмент, который использует XcodeGen от Bazel для генерации проекта Xcode. Это приводит к запутанной цепочке преобразований: от файлов Bazel к YAML XcodeGen и, наконец, к проектам Xcode. Такая многослойная косвенность часто усложняет устранение неполадок, делая диагностику и решение проблем более трудными.