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

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

## Целевые ресурсы {#target-resources}

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

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

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

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


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

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

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

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


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

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

### Свифт {#swift}

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

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

### Objective-C {#objectivec}

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

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

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


> [!TIP]
> **Поддержка Ресурсов В Библиотеках С Помощью Бумаги**
>
> Если целевой продукт, например библиотека, не поддерживает ресурсы, Tuist
> включит ресурсы в целевой продукт типа `bundle`, гарантируя, что они окажутся в
> конечном продукте и что интерфейс будет указывать на правильный бандл.


## Аксессоры ресурсов {#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` |
| Плисты              | `{NameOfPlist}.swift`    |
| Шрифты              | `Шрифты+{Цель}.swift`    |
| Файлы               | `Files+{Target}.swift`   |

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

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

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

| Ресурсы          | Имя шаблона                |
| ---------------- | -------------------------- |
| строки           | `Строки.трафарет`          |
| активы           | `Активы.трафарет`          |
| списки           | `Plists.stencil`           |
| шрифты           | `Шрифты.трафарет`          |
| coreData         | `CoreData.stencil`         |
| interfaceBuilder | `InterfaceBuilder.stencil` |
| json             | `JSON.stencil`             |
| yaml             | `YAML.stencil`             |
| файлы            | `Файлы.трафарет`           |

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

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

> [!NOTE]
> **Reference**
>
> Вы можете посмотреть на [this
> fixture](https://github.com/tuist/tuist/tree/main/cli/Fixtures/ios_app_with_templates),
> чтобы увидеть пример использования пользовательских шаблонов для синтеза
> аксессоров к ресурсам.

