Сгенерированные файлы
Tuist может генерировать файлы и код на этапе генерации, чтобы упростить управление проектами Xcode и работу с ними. На этой странице вы узнаете об этой функциональности и о том, как использовать её в своих проектах.
Ресурсы таргета#
Проекты Xcode поддерживают добавление ресурсов к таргетам. Однако это создаёт для команд ряд сложностей, особенно при работе с модульным проектом, где исходный код и ресурсы часто перемещаются:
- Несогласованный доступ во время выполнения: то, куда попадают ресурсы в конечном продукте и как вы получаете к ним доступ, зависит от типа продукта таргета. Например, если ваш таргет представляет собой приложение, ресурсы копируются в бандл приложения. Это приводит к тому, что код, обращающийся к ресурсам, делает предположения о структуре бандла, что не идеально, так как усложняет понимание кода и перемещение ресурсов.
- Продукты, не поддерживающие ресурсы: существуют определённые типы продуктов, такие как статические библиотеки, которые не являются бандлами и поэтому не поддерживают ресурсы. Из-за этого приходится использовать другой тип продукта, например фреймворки, что может добавить накладные расходы вашему проекту или приложению. Например, статические фреймворки будут статически линковаться с конечным продуктом, и потребуется этап сборки, чтобы скопировать только ресурсы в конечный продукт. Или динамические фреймворки, где Xcode скопирует и бинарный файл, и ресурсы в конечный продукт, но это увеличит время запуска вашего приложения, поскольку фреймворк нужно загружать динамически.
- Подверженность ошибкам времени выполнения: ресурсы идентифицируются по имени и расширению (строки). Поэтому опечатка в любом из них приведёт к ошибке времени выполнения при попытке доступа к ресурсу. Это не идеально, потому что ошибка не обнаруживается на этапе компиляции и может привести к сбоям в релизной сборке.
Tuist решает указанные проблемы, генерируя единый интерфейс для доступа к бандлам и ресурсам, который абстрагирует детали реализации.
Хотя доступ к ресурсам через сгенерированный Tuist интерфейс не является обязательным, мы рекомендуем его, так как это упрощает понимание кода и перемещение ресурсов.
Ресурсы#
Tuist предоставляет интерфейсы для объявления содержимого файлов, таких как Info.plist или entitlements, на Swift. Это полезно для обеспечения согласованности между таргетами и проектами и позволяет компилятору выявлять проблемы на этапе компиляции. Вы также можете создать собственные абстракции для моделирования содержимого и использования их в разных таргетах и проектах.
При генерации вашего проекта Tuist сформирует содержимое этих файлов и запишет их в директорию Derived относительно директории, содержащей проект, в котором они определены.
Мы рекомендуем добавить директорию Derived в файл .gitignore вашего проекта.
Аксессоры бандлов#
Tuist генерирует интерфейс для доступа к бандлу, содержащему ресурсы таргета.
Swift#
Таргет будет содержать расширение типа Bundle, которое предоставляет доступ к бандлу:
let bundle = Bundle.module
Objective-C#
В Objective-C вы получите интерфейс {Target}Resources для доступа к бандлу:
NSBundle *bundle = [MyFeatureResources bundle];
В настоящее время Tuist не генерирует аксессоры бандлов ресурсов для внутренних таргетов, содержащих только исходный код на Objective-C. Это известное ограничение, отслеживаемое в задаче #6456.
Если продукт таргета, например библиотека, не поддерживает ресурсы, Tuist включит ресурсы в таргет с типом продукта bundle, гарантируя, что они попадут в конечный продукт и что интерфейс будет указывать на правильный бандл. Эти сгенерированные бандлы автоматически помечаются тегом tuist:synthesized и наследуют все теги от родительского таргета, что позволяет обращаться к ним в профилях кэша.
Аксессоры ресурсов#
Ресурсы идентифицируются по имени и расширению с помощью строк. Это не идеально, потому что ошибки не обнаруживаются на этапе компиляции и могут приводить к сбоям в релизной сборке. Чтобы предотвратить это, Tuist интегрирует SwiftGen в процесс генерации проекта для создания интерфейса доступа к ресурсам. Благодаря этому вы можете уверенно обращаться к ресурсам, полагаясь на компилятор для выявления любых проблем.
Tuist включает шаблоны для генерации аксессоров следующих типов ресурсов по умолчанию:
| Тип ресурса | Сгенерированный файл |
|---|---|
| Изображения и цвета | Assets+{Target}.swift |
| Строки | Strings+{Target}.swift |
| Plist-файлы | {NameOfPlist}.swift |
| Шрифты | Fonts+{Target}.swift |
| Файлы | Files+{Target}.swift |
Примечание: вы можете отключить генерацию аксессоров ресурсов для конкретного проекта, передав опцию
disableSynthesizedResourceAccessorsв настройки проекта.
Пользовательские шаблоны#
Если вы хотите предоставить собственные шаблоны для генерации аксессоров к другим типам ресурсов, которые должны поддерживаться 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, передав список нужных синтезаторов ресурсов:
let project = Project(resourceSynthesizers: [.string(), .fonts()])
Вы можете посмотреть этот пример, чтобы увидеть, как использовать пользовательские шаблоны для генерации аксессоров к ресурсам.