# Лучшие практики {#best-practices}

За годы работы с различными командами и проектами мы выделили набор лучших
практик, которых мы рекомендуем придерживаться при работе с проектами Tuist и
Xcode. Эти практики не являются обязательными, но они помогут вам
структурировать свои проекты таким образом, чтобы их было легче поддерживать и
масштабировать.

## Xcode {#xcode}

### Нежелательные шаблоны {#discouraged-patterns}

#### Конфигурации для моделирования удаленных сред {#configurations-to-model-remote-environments}

Многие организации используют конфигурации сборки для моделирования различных
удаленных сред (например, `Debug-Production` или `Release-Canary`), но такой
подход имеет ряд недостатков:

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

Конфигурации сборки были разработаны для воплощения различных настроек сборки, и
проектам редко требуется больше, чем просто `Debug` и `Release`. Необходимость
моделирования различных сред может быть достигнута по-разному:

- **В отладочных сборках:** Вы можете включить в приложение все конфигурации,
  которые должны быть доступны в разработке (например, конечные точки), и
  переключать их во время выполнения. Переключение может происходить как с
  помощью переменных окружения запуска схемы, так и с помощью пользовательского
  интерфейса внутри приложения.
- **В сборках релиза:** В случае релиза вы можете включить только ту
  конфигурацию, к которой привязана сборка релиза, и не включать логику
  выполнения для переключения конфигураций с помощью директив компилятора.

> [!NOTE]
> **Нестандартные Конфигурации**
>
> Хотя Tuist поддерживает нестандартные конфигурации и упрощает управление ими по
> сравнению с ванильными проектами Xcode, вы будете получать предупреждения, если
> конфигурации не будут согласованы по всему графу зависимостей. Это помогает
> обеспечить надежность сборки и предотвратить проблемы, связанные с
> конфигурацией.


## Сгенерированные проекты

### Строящиеся папки

В Tuist 4.62.0 добавлена поддержка **папок для сборки** (синхронизированные
группы Xcode), функция, появившаяся в Xcode 16 для уменьшения конфликтов
слияния.

Хотя шаблоны подстановочных знаков Туиста (например, `Sources/**/*.swift`) уже
устраняют конфликты слияния в генерируемых проектах, папки с возможностью сборки
дают дополнительные преимущества:

- **Автоматическая синхронизация**: Структура вашего проекта остается
  синхронизированной с файловой системой - не требуется регенерация при
  добавлении или удалении файлов
- **Рабочие процессы с поддержкой искусственного интеллекта**: Ассистенты и
  агенты по кодированию могут изменять вашу кодовую базу, не вызывая регенерации
  проекта
- **Более простая конфигурация**: Определение путей к папкам вместо управления
  явными списками файлов

Мы рекомендуем использовать собираемые папки вместо традиционных атрибутов
`Target.sources` и `Target.resources` для более рациональной разработки.

::: code-group

```swift [With buildable folders]
let target = Target(
  name: "App",
  buildableFolders: ["App/Sources", "App/Resources"]
)
```

```swift [Without buildable folders]
let target = Target(
  name: "App",
  sources: ["App/Sources/**"],
  resources: ["App/Resources/**"]
)
```
<!-- -->
:::

### Зависимости

#### Принудительное включение разрешенных версий в CI

При установке зависимостей Swift Package Manager в CI мы рекомендуем
использовать флаг `--force-resolved-versions` для обеспечения
детерминированности сборок:

```bash
tuist install --force-resolved-versions
```

Этот флаг гарантирует, что зависимости будут разрешены с использованием точных
версий, отмеченных в `Package.resolved`, устраняя проблемы, вызванные
недетерминизмом при разрешении зависимостей. Это особенно важно для CI, где
воспроизводимые сборки очень важны.
