Синтезированные файлы
Tuist может генерировать файлы и код во время генерации, чтобы привнести некоторое удобство в управление и работу с проектами Xcode. На этой странице вы узнаете об этой функциональности и о том, как использовать ее в своих проектах.
Целевые ресурсы
Проекты Xcode поддерживают добавление ресурсов к целям. Однако они ставят команды перед некоторыми проблемами, особенно при работе с модульным проектом, в котором исходные тексты и ресурсы часто перемещаются:
- Непоследовательный доступ во время выполнения: То, где ресурсы оказываются в конечном продукте и как вы получаете к ним доступ, зависит от целевого продукта. Например, если целевой продукт представляет собой приложение, ресурсы копируются в пучок приложения. Это приводит к тому, что код, обращающийся к ресурсам, делает предположения о структуре пучка, что не является идеальным, поскольку усложняет понимание кода и перемещение ресурсов.
- Продукты, которые не поддерживают ресурсы: Есть некоторые продукты, например статические библиотеки, которые не являются пакетами и поэтому не поддерживают ресурсы. Из-за этого вам придется прибегнуть к другому типу продуктов, например фреймворкам, которые могут добавить некоторые накладные расходы в ваш проект или приложение. Например, статические фреймворки будут статически привязаны к конечному продукту, и фаза сборки потребуется только для копирования ресурсов в конечный продукт. Или динамические фреймворки, когда Xcode скопирует и бинарник, и ресурсы в конечный продукт, но это увеличит время запуска вашего приложения, потому что фреймворк должен загружаться динамически.
- Подвержены ошибкам во время выполнения: Ресурсы идентифицируются по их имени и расширению (строкам). Поэтому опечатка в любой из них приведет к ошибке времени выполнения при попытке доступа к ресурсу. Это не идеальный вариант, поскольку он не отлавливается во время компиляции и может привести к сбоям в релизе.
Туист решает вышеуказанные проблемы путем синтеза унифицированного интерфейса для доступа к пакетам и ресурсам, который абстрагирует детали реализации.
РЕКОМЕНДУЕТСЯ
Несмотря на то, что доступ к ресурсам через интерфейс, синтезированный Туистом, не является обязательным, мы рекомендуем это делать, потому что так код легче воспринимается, а ресурсы легче перемещаются.
Ресурсы
Tuist предоставляет интерфейсы для объявления содержимого таких файлов, как Info.plist или прав доступа в Swift. Это полезно для обеспечения согласованности между целями и проектами, а также для использования компилятора для выявления проблем во время компиляции. Вы также можете придумать свои собственные абстракции для моделирования содержимого и обмена им между целями и проектами.
Когда ваш проект будет сгенерирован, Tuist синтезирует содержимое этих файлов и запишет их в каталог Derived относительно каталога, содержащего проект, в котором они определены.
::: Совет ГИТИГНОРА ДЕРЕВЯННОЙ ДИРЕКТОРИИ
Мы рекомендуем добавить каталог Derived в файл .gitignore вашего проекта.
:::
Аксессоры бандлов
Tuist синтезирует интерфейс для доступа к пакету, содержащему целевые ресурсы.
Свифт
Цель будет содержать расширение типа Bundle, которое раскрывает пакет:
swift
let bundle = Bundle.moduleObjective-C
В Objective-C для доступа к бандлу используется интерфейс {Target}Resources:
objc
NSBundle *bundle = [MyFeatureResources bundle];ОГРАНИЧЕНИЕ С ВНУТРЕННИМИ ТАРГЕТАМИ
В настоящее время Tuist не генерирует аксессоры ресурсных пучков для внутренних целей, содержащих только исходники Objective-C. Это известное ограничение, отслеженное в issue #6456.
ПОДДЕРЖКА РЕСУРСОВ В БИБЛИОТЕКАХ С ПОМОЩЬЮ БУМАГИ
Если целевой продукт, например библиотека, не поддерживает ресурсы, Tuist включит ресурсы в целевой продукт типа bundle, гарантируя, что они окажутся в конечном продукте и что интерфейс будет указывать на правильный бандл.
Аксессоры ресурсов
Ресурсы идентифицируются по их имени и расширению с помощью строк. Это не идеальный вариант, поскольку он не отлавливается во время компиляции и может привести к сбоям при выпуске. Чтобы предотвратить это, Tuist интегрирует SwiftGen в процесс генерации проекта, чтобы синтезировать интерфейс для доступа к ресурсам. Благодаря этому вы можете уверенно обращаться к ресурсам, используя компилятор для выявления любых проблем.
По умолчанию Tuist включает шаблоны для синтеза аксессоров для следующих типов ресурсов:
| Тип ресурса | Синтезированные файлы |
|---|---|
| Изображения и цвета | Assets+{Target}.swift |
| Струны | Strings+{Target}.swift |
| Плисты | {NameOfPlist}.swift |
| Шрифты | Шрифты+{Цель}.swift |
| Файлы | Files+{Target}.swift |
Примечание: Вы можете отключить синтез аксессоров ресурсов на основе каждого проекта, передав опцию
disableSynthesizedResourceAccessorsв опции проекта.
Пользовательские шаблоны
Если вы хотите предоставить собственные шаблоны для синтеза аксессоров к другим типам ресурсов, которые должны поддерживаться 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()])REFERENCE
Вы можете посмотреть на this fixture, чтобы увидеть пример использования пользовательских шаблонов для синтеза аксессоров к ресурсам.
