Ir al contenido

Archivos generados

Tuist puede generar archivos y código durante la generación para facilitar la gestión y el trabajo con proyectos de Xcode. En esta página aprenderás sobre esta funcionalidad y cómo puedes usarla en tus proyectos.

Recursos del target#

Los proyectos de Xcode permiten añadir recursos a los targets. Sin embargo, esto presenta algunos desafíos para los equipos, especialmente cuando se trabaja con un proyecto modular donde las fuentes y los recursos suelen moverse:

  • Acceso inconsistente en tiempo de ejecución: Dónde acaban los recursos en el producto final y cómo accedes a ellos depende del tipo de producto del target. Por ejemplo, si tu target representa una aplicación, los recursos se copian al bundle de la aplicación. Esto lleva a que el código que accede a los recursos asuma ciertas estructuras del bundle, lo cual no es ideal porque dificulta el razonamiento sobre el código y el movimiento de los recursos.
  • Productos que no admiten recursos: Hay ciertos productos, como las bibliotecas estáticas, que no son bundles y, por tanto, no admiten recursos. Debido a ello, debes recurrir a otro tipo de producto, como frameworks, lo que puede añadir cierta sobrecarga a tu proyecto o aplicación. Por ejemplo, los frameworks estáticos se enlazarán estáticamente al producto final y se requiere una fase de compilación para copiar solo los recursos al producto final. O los frameworks dinámicos, donde Xcode copiará tanto el binario como los recursos al producto final, pero aumentará el tiempo de inicio de tu aplicación porque el framework debe cargarse dinámicamente.
  • Propenso a errores en tiempo de ejecución: Los recursos se identifican por su nombre y extensión (cadenas). Por lo tanto, un error tipográfico en cualquiera de ellos provocará un error en tiempo de ejecución al intentar acceder al recurso. Esto no es ideal porque no se detecta en tiempo de compilación y puede provocar fallos en la versión de release.

Tuist resuelve los problemas anteriores generando una interfaz unificada para acceder a bundles y recursos que abstrae los detalles de implementación.

Recomendado

Aunque acceder a los recursos a través de la interfaz generada por Tuist no es obligatorio, lo recomendamos porque facilita el razonamiento sobre el código y el movimiento de los recursos.

Recursos#

Tuist proporciona interfaces para declarar el contenido de archivos como Info.plist o entitlements en Swift. Esto es útil para garantizar la coherencia entre targets y proyectos, y aprovechar el compilador para detectar problemas en tiempo de compilación. También puedes crear tus propias abstracciones para modelar el contenido y compartirlo entre targets y proyectos.

Cuando se genera tu proyecto, Tuist sintetizará el contenido de esos archivos y los escribirá en el directorio Derived relativo al directorio que contiene el proyecto que los define.

Añadir Derived al .gitignore

Recomendamos añadir el directorio Derived al archivo .gitignore de tu proyecto.

Accesores de bundle#

Tuist genera una interfaz para acceder al bundle que contiene los recursos del target.

Swift#

El target contendrá una extensión del tipo Bundle que expone el bundle:

swift
let bundle = Bundle.module

Objective-C#

En Objective-C, obtendrás una interfaz {Target}Resources para acceder al bundle:

objc
NSBundle *bundle = [MyFeatureResources bundle];
Limitación con targets internos

Actualmente, Tuist no genera accesores de bundle de recursos para targets internos que contienen solo fuentes en Objective-C. Esta es una limitación conocida registrada en la incidencia #6456.

Admitir recursos en bibliotecas mediante bundles

Si un producto de target, por ejemplo una biblioteca, no admite recursos, Tuist incluirá los recursos en un target de tipo de producto bundle, asegurando que acaben en el producto final y que la interfaz apunte al bundle correcto. Estos bundles generados se etiquetan automáticamente con tuist:synthesized y heredan todas las etiquetas de su target padre, lo que te permite dirigirte a ellos en los perfiles de caché.

Accesores de recursos#

Los recursos se identifican por su nombre y extensión mediante cadenas. Esto no es ideal porque no se detecta en tiempo de compilación y puede provocar fallos en la versión de release. Para evitarlo, Tuist integra SwiftGen en el proceso de generación del proyecto para sintetizar una interfaz para acceder a los recursos. Gracias a ello, puedes acceder a los recursos con confianza, aprovechando el compilador para detectar cualquier problema.

Tuist incluye plantillas para sintetizar accesores para los siguientes tipos de recursos de forma predeterminada:

Tipo de recursoArchivo generado
Imágenes y coloresAssets+{Target}.swift
CadenasStrings+{Target}.swift
Plists{NameOfPlist}.swift
FuentesFonts+{Target}.swift
ArchivosFiles+{Target}.swift

Nota: Puedes desactivar la generación de accesores de recursos por proyecto pasando la opción disableSynthesizedResourceAccessors a las opciones del proyecto.

Plantillas personalizadas#

Si quieres proporcionar tus propias plantillas para sintetizar accesores a otros tipos de recursos, que deben ser compatibles con SwiftGen, puedes crearlas en Tuist/ResourceSynthesizers/{name}.stencil, donde el nombre es la versión en camelCase del recurso.

RecursoNombre de la plantilla
stringsStrings.stencil
assetsAssets.stencil
plistsPlists.stencil
fontsFonts.stencil
coreDataCoreData.stencil
interfaceBuilderInterfaceBuilder.stencil
jsonJSON.stencil
yamlYAML.stencil
filesFiles.stencil

Si quieres configurar la lista de tipos de recursos para los que sintetizar accesores, puedes usar la propiedad Project.resourceSynthesizers pasando la lista de sintetizadores de recursos que quieras utilizar:

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

Puedes consultar este ejemplo para ver cómo usar plantillas personalizadas para sintetizar accesores a recursos.