# Сгенерированные файлы {#synthesized-files}

Tuist может генерировать файлы и код на этапе генерации, чтобы упростить управление проектами Xcode и работу с ними. На этой странице вы узнаете об этой функциональности и о том, как использовать её в своих проектах.

## Ресурсы таргета {#target-resources}

Проекты Xcode поддерживают добавление ресурсов к таргетам. Однако это создаёт для команд ряд сложностей, особенно при работе с модульным проектом, где исходный код и ресурсы часто перемещаются:

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

Tuist решает указанные проблемы, **генерируя единый интерфейс для доступа к бандлам и ресурсам**, который абстрагирует детали реализации.

> [!WARNING]
> **Рекомендуется**
>
> Хотя доступ к ресурсам через сгенерированный Tuist интерфейс не является обязательным, мы рекомендуем его, так как это упрощает понимание кода и перемещение ресурсов.


## Ресурсы {#resources}

Tuist предоставляет интерфейсы для объявления содержимого файлов, таких как `Info.plist` или entitlements, на Swift. Это полезно для обеспечения согласованности между таргетами и проектами и позволяет компилятору выявлять проблемы на этапе компиляции. Вы также можете создать собственные абстракции для моделирования содержимого и использования их в разных таргетах и проектах.

При генерации вашего проекта Tuist сформирует содержимое этих файлов и запишет их в директорию `Derived` относительно директории, содержащей проект, в котором они определены.

> [!TIP]
> **Добавьте директорию Derived в .gitignore**
>
> Мы рекомендуем добавить директорию `Derived` в файл `.gitignore` вашего проекта.


## Аксессоры бандлов {#bundle-accessors}

Tuist генерирует интерфейс для доступа к бандлу, содержащему ресурсы таргета.

### Swift {#swift}

Таргет будет содержать расширение типа `Bundle`, которое предоставляет доступ к бандлу:

```swift
let bundle = Bundle.module
```

### Objective-C {#objectivec}

В Objective-C вы получите интерфейс `{Target}Resources` для доступа к бандлу:

```objc
NSBundle *bundle = [MyFeatureResources bundle];
```

> [!WARNING]
> **Ограничение для внутренних таргетов**
>
> В настоящее время Tuist не генерирует аксессоры бандлов ресурсов для внутренних таргетов, содержащих только исходный код на Objective-C. Это известное ограничение, отслеживаемое в [задаче #6456](https://github.com/tuist/tuist/issues/6456).


> [!TIP]
> **Поддержка ресурсов в библиотеках через бандлы**
>
> Если продукт таргета, например библиотека, не поддерживает ресурсы, Tuist включит ресурсы в таргет с типом продукта `bundle`, гарантируя, что они попадут в конечный продукт и что интерфейс будет указывать на правильный бандл. Эти сгенерированные бандлы автоматически помечаются тегом `tuist:synthesized` и наследуют все теги от родительского таргета, что позволяет обращаться к ним в <.localized_link href="/guides/features/projects/metadata-tags#system-tags">профилях кэша</.localized_link>.


## Аксессоры ресурсов {#resource-accessors}

Ресурсы идентифицируются по имени и расширению с помощью строк. Это не идеально, потому что ошибки не обнаруживаются на этапе компиляции и могут приводить к сбоям в релизной сборке. Чтобы предотвратить это, Tuist интегрирует [SwiftGen](https://github.com/SwiftGen/SwiftGen) в процесс генерации проекта для создания интерфейса доступа к ресурсам. Благодаря этому вы можете уверенно обращаться к ресурсам, полагаясь на компилятор для выявления любых проблем.

Tuist включает [шаблоны](https://github.com/tuist/tuist/tree/main/cli/Sources/TuistGenerator/Templates) для генерации аксессоров следующих типов ресурсов по умолчанию:

| Тип ресурса | Сгенерированный файл |
| --- | ---- |
| Изображения и цвета | `Assets+{Target}.swift` |
| Строки | `Strings+{Target}.swift` |
| Plist-файлы | `{NameOfPlist}.swift` |
| Шрифты | `Fonts+{Target}.swift` |
| Файлы | `Files+{Target}.swift` |

> Примечание: вы можете отключить генерацию аксессоров ресурсов для конкретного проекта, передав опцию `disableSynthesizedResourceAccessors` в настройки проекта.

#### Пользовательские шаблоны {#custom-templates}

Если вы хотите предоставить собственные шаблоны для генерации аксессоров к другим типам ресурсов, которые должны поддерживаться [SwiftGen](https://github.com/SwiftGen/SwiftGen), вы можете создать их по пути `Tuist/ResourceSynthesizers/{name}.stencil`, где имя — это версия названия ресурса в camelCase.

| Ресурс | Имя шаблона |
| --- | --- |
| strings | `Strings.stencil` |
| assets | `Assets.stencil` |
| plists | `Plists.stencil` |
| fonts | `Fonts.stencil` |
| coreData | `CoreData.stencil` |
| interfaceBuilder | `InterfaceBuilder.stencil` |
| json | `JSON.stencil` |
| yaml | `YAML.stencil` |
| files | `Files.stencil` |

Если вы хотите настроить список типов ресурсов, для которых нужно сгенерировать аксессоры, используйте свойство `Project.resourceSynthesizers`, передав список нужных синтезаторов ресурсов:

```swift
let project = Project(resourceSynthesizers: [.string(), .fonts()])
```

> [!NOTE]
> **Справка**
>
> Вы можете посмотреть [этот пример](https://github.com/tuist/tuist/tree/main/examples/xcode/generated_ios_app_with_templates), чтобы увидеть, как использовать пользовательские шаблоны для генерации аксессоров к ресурсам.
