Сгенерированные проекты
Сгенерированные проекты - жизнеспособная альтернатива, которая помогает преодолевать проблемы при сохранении сложности и издержек на приемлемом уровне. Xcode-проекты рассматриваются в качестве основополагающего элемента, для обеспечения устойчивости к будущим обновлениям Xcode, и используемые механизмы генерации Xcode-проектов предоставляют модуле-ориентированное декларативное API. Tuist использует объявления проектов для упрощения сложностей модуляризации**, оптимизации рабочих процессов, таких как сборка и тестирование в различных средах, и для облегчения доступности эволюции Xcode-проектов для более широкой аудитории.
Как это работает?
Чтобы начать работу со сгенерированными XCode-проектами, вам нужно определить свой проект с помощью Предметно-ориентированного языка (DSL) Tuist. Это подразумевает использование манифест файлов, таких как Workspace.swift
или Project.swift
. Если вы прежде работали с менеджером пакетов Swift, то подход покажется вам очень похож.
После того как вы определили свой проект, Tuist предоставит вам различные процессы для управления и взаимодействия с ним:
- Сгенерировать: Это основной рабочий процесс. Используйте его для генерации проекта совместимого с Xcode.
- Build: Этот рабочий процесс не только генерирует Xcode-проект, но и использует
xcodebuild
для его компиляции. - Test: Рабочий процесс, выполняющийся аналогично сборке: он не только генерирует Xcode-проект, но и использует
xcodebuild
для его тестирования.
Сложности при работе с Xcode-проектами
По мере роста Xcode-проектов, организации могут столкнуться с падением производительности из-за ряда факторов, включая ненадёжные инкрементальные сборки, частую очистку глобального кэша Xcode разработчиками, сталкивающимися с проблемами, и хрупкие конфигурации проектов. Для поддержания быстрого развития функционала, организации, как правило, исследуют различные стратегии.
Некоторые организации предпочитают обойти компилятор путём абстрагирования платформы с использованием динамически выполняемых сред на основе JavaScript, к примеру React Native. Хотя этот подход может быть эффективным, он усложняет доступ к нативным функциям платформы. Другие организации выбирают модуляризацию кодовой базы, которая помогает установить явные границы, упрощая работу с кодом и улучшая время сборки. Однако формат Xcode-проектов не предназначен для модуляризации, что приводит к появлению неявных конфигураций, которые мало кто может понять и которые часто конфликтуют. Это приводит к [Фактору автобуса]{6}, и, хотя инкрементальные сборки могут улучшаться, разработчикам всё ещё может понадобиться очищать кэш сборки Xcode'а (Derived Data) при ошибках сборки. Для решения этой проблемы некоторые организации отказываются от системы сборки Xcode и переходят к альтернативам, таким как Buck или Bazel. Однако это связано с высокой сложностью и необходимостью обслуживания.
Альтернативы
Менеджер пакетов Swift
В то время как Swift Package Manager (SPM) в первую очередь сосредоточен на зависимостях, Tuist предлагает другой подход. С помощью Tuist вы не просто определяете пакеты для интеграции с SPM, вы формируете свои проекты, используя привычные понятия, такие как project, workspace, target и scheme.
XcodeGen
XcodeGen — это специализированный генератор проектов, предназначенный для уменьшения конфликтов в совместных Xcode-проектах и упрощения некоторых аспектов внутренней работы Xcode. Однако проекты определяются с использованием сериализуемых форматов, таких как YAML. В отличие от Swift, это не позволяет разработчикам использовать абстракции или выполнять проверки без внедрения дополнительных инструментов. Хотя XcodeGen предоставляет способ сопоставлять зависимости с внутренним представлением для проверки и оптимизации, он всё ещё раскрывает разработчикам внутренние особенности Xcode. Это может сделать XcodeGen подходящей основой для создания инструментов, как это реализовано в сообществе Bazel, но он не является оптимальным решением для целостной эволюции проектов, направленной на поддержание здоровой и продуктивной среды.
Bazel
Bazel — это продвинутая система сборки, известная своими возможностями удалённого кэширования, которая набирает популярность в сообществе Swift именно благодаря этой функции. Однако, учитывая ограниченную расширяемость Xcode и его системы сборки, замена её на Bazel требует значительных усилий и постоянного сопровождения. Лишь немногие компании с обширными ресурсами могут позволить себе такие накладные расходы, что подтверждается ограниченным списком фирм, активно инвестирующих в интеграцию Bazel с Xcode. Интересно, что сообщество создало инструмент, использующий Bazel и XcodeGen для создания Xcode-проекта. Такая многоуровневая абстракция часто усложняет диагностику, делая поиск и устранение проблем значительно труднее.