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

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

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

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

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

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

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

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

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


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

### Swift Package Manager {#swift-package-manager}

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

### 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), который использует XcodeGen от Bazel для генерации проекта Xcode. Это приводит к запутанной цепочке преобразований: от файлов Bazel к YAML XcodeGen и, наконец, к проектам Xcode. Такая многослойная косвенность часто усложняет устранение неполадок, делая диагностику и решение проблем более трудными.
