Перейти к содержимому

Сгенерированные файлы

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

Ресурсы таргета#

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

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

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

Рекомендуется

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

Ресурсы#

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

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

Добавьте директорию Derived в .gitignore

Мы рекомендуем добавить директорию Derived в файл .gitignore вашего проекта.

Аксессоры бандлов#

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

Swift#

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

swift
let bundle = Bundle.module

Objective-C#

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

objc
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.

РесурсИмя шаблона
stringsStrings.stencil
assetsAssets.stencil
plistsPlists.stencil
fontsFonts.stencil
coreDataCoreData.stencil
interfaceBuilderInterfaceBuilder.stencil
jsonJSON.stencil
yamlYAML.stencil
filesFiles.stencil

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

swift
let project = Project(resourceSynthesizers: [.string(), .fonts()])
Справка

Вы можете посмотреть этот пример, чтобы увидеть, как использовать пользовательские шаблоны для генерации аксессоров к ресурсам.