# Сгенерированные проекты {#generated-projects}

Сгенерированные проекты - жизнеспособная альтернатива, которая помогает
преодолевать проблемы при сохранении сложности и издержек на приемлемом уровне.
Xcode-проекты рассматриваются в качестве основополагающего элемента, для
обеспечения устойчивости к будущим обновлениям Xcode, и используемые механизмы
генерации Xcode-проектов предоставляют модуле-ориентированное декларативное API.
Tuist использует объявления проектов для упрощения сложностей модуляризации**,
оптимизации рабочих процессов, таких как сборка и тестирование в различных
средах, и для облегчения доступности эволюции Xcode-проектов для более широкой
аудитории.

## Как это работает? {#how-does-it-work}

Чтобы начать работу со сгенерированными XCode-проектами, вам нужно определить
свой проект с помощью **Предметно-ориентированного языка (DSL) Tuist**. Это
подразумевает использование манифест файлов, таких как `Workspace.swift` или
`Project.swift`. Если вы прежде работали с менеджером пакетов Swift, то подход
покажется вам очень похож.

После того как вы определили свой проект, Tuist предоставит вам различные
процессы для управления и взаимодействия с ним:

- **Сгенерировать:** Это основной рабочий процесс. Используйте его для генерации
  проекта совместимого с Xcode.
- **<LocalizedLink href="/cli/build">Build</LocalizedLink>:** Этот
  рабочий процесс не только генерирует Xcode-проект, но и использует
  `xcodebuild` для его компиляции.
- **<LocalizedLink href="/cli/test">Test</LocalizedLink>:** Рабочий
  процесс, выполняющийся аналогично сборке: он не только генерирует
  Xcode-проект, но и использует `xcodebuild` для его тестирования.

## Сложности при работе с Xcode-проектами {#challenges-with-xcode-projects}

По мере роста Xcode-проектов, **организации могут столкнуться с падением
производительности** из-за ряда факторов, включая ненадёжные инкрементальные
сборки, частую очистку глобального кэша Xcode разработчиками, сталкивающимися с
проблемами, и хрупкие конфигурации проектов. Для поддержания быстрого развития
функционала, организации, как правило, исследуют различные стратегии.

Некоторые организации предпочитают обойти компилятор путём абстрагирования
платформы с использованием динамически выполняемых сред на основе JavaScript, к
примеру [React Native](https://reactnative.dev/). Хотя этот подход может быть
эффективным, он [усложняет доступ к нативным функциям
платформы](https://shopify.engineering/building-app-clip-react-native). Другие
организации выбирают **модуляризацию кодовой базы**, которая помогает установить
явные границы, упрощая работу с кодом и улучшая время сборки. Однако формат
Xcode-проектов не предназначен для модуляризации, что приводит к появлению
неявных конфигураций, которые мало кто может понять и которые часто конфликтуют.
Это приводит к [Фактору автобуса]{6}, и, хотя инкрементальные сборки могут
улучшаться, разработчикам всё ещё может понадобиться очищать кэш сборки Xcode'а
(Derived Data) при ошибках сборки. Для решения этой проблемы некоторые
организации **отказываются от системы сборки Xcode** и переходят к
альтернативам, таким как [Buck](https://buck.build/) или
[Bazel](https://bazel.build/). Однако это связано с [высокой сложностью и
необходимостью обслуживания](https://bazel.build/migrate/xcode).


## Альтернативы {#alternatives}

### Менеджер пакетов Swift {#swift-package-manager}

В то время как Swift Package Manager (SPM) в первую очередь сосредоточен на
зависимостях, Tuist предлагает другой подход. С помощью Tuist вы не просто
определяете пакеты для интеграции с SPM, вы формируете свои проекты, используя
привычные понятия, такие как project, workspace, target и scheme.

### XcodeGen {#xcodegen}

[XcodeGen](https://github.com/yonaskolb/XcodeGen) — это специализированный
генератор проектов, предназначенный для уменьшения конфликтов в совместных
Xcode-проектах и упрощения некоторых аспектов внутренней работы Xcode. Однако
проекты определяются с использованием сериализуемых форматов, таких как
[YAML](https://yaml.org/). В отличие от Swift, это не позволяет разработчикам
использовать абстракции или выполнять проверки без внедрения дополнительных
инструментов. Хотя XcodeGen предоставляет способ сопоставлять зависимости с
внутренним представлением для проверки и оптимизации, он всё ещё раскрывает
разработчикам внутренние особенности Xcode. Это может сделать XcodeGen
подходящей основой для [создания
инструментов](https://github.com/MobileNativeFoundation/rules_xcodeproj), как
это реализовано в сообществе Bazel, но он не является оптимальным решением для
целостной эволюции проектов, направленной на поддержание здоровой и продуктивной
среды.

### Bazel {#bazel}

[Bazel](https://bazel.build) — это продвинутая система сборки, известная своими
возможностями удалённого кэширования, которая набирает популярность в сообществе
Swift именно благодаря этой функции. Однако, учитывая ограниченную расширяемость
Xcode и его системы сборки, замена её на Bazel требует значительных усилий и
постоянного сопровождения. Лишь немногие компании с обширными ресурсами могут
позволить себе такие накладные расходы, что подтверждается ограниченным списком
фирм, активно инвестирующих в интеграцию Bazel с Xcode. Интересно, что
сообщество создало
[инструмент](https://github.com/MobileNativeFoundation/rules_xcodeproj),
использующий Bazel и XcodeGen для создания Xcode-проекта. Такая многоуровневая
абстракция часто усложняет диагностику, делая поиск и устранение проблем
значительно труднее.
