Cómo agregar recursos usando SPM
Libranner Santos
20 septiembre, 20223min de lectura
A partir de Xcode 12 podemos agregar recursos a nuestros paquetes de Swift Package Manager.
Sin embargo, hay unas cuantas cosas que debemos tener en cuenta:
- Tus recursos deben estar dentro del directorio Sources de tu paquete.
- Si el paquete es un comand-line tool, los archivos requeridos deben instalarse junto con el ejecutable. Si es para aplicaciones no tienes que hacer nada.
- Archivos conocidos por Xcode como .xcassets, .storyboard, .xib, .xcdatamodel son optimizados por Xcode automáticamente al momento de compilar.
- Para otros tipos de archivos, por ejemplo .json, .png, debes indicar como deseas que sea manejados, hay dos opciones process y copy.
Más acerca de .process y .copy
process(_:localization:)
y copy(_:)
son dos métodos estáticos de Resource
.
process(_:localization:)
, usará las reglas que existan para la plataforma en cuestión, por ejemplo, comprimir los archivos .xcasset cuando sea posible. También notamos que aceptalocalization
como parámetro, esto nos permite pasar explícitamente que localización queremos para el recurso.copy(_:)
, no hace ninguna transformación y copia el archivo tal cual. Debes tener en cuenta que si usascopy(_:)
, no se usarán ninguna de las reglas disponibles para la plataforma. Esto aplica también para directorios completos.- Se recomienda usar siempre
process(_:localization:)
, porque en dado casi no haya ninguna optimización disponible se utilizaríacopy(_:)
.
Pasos para agregar recursos
- En el manifiesto Package.swift busca el target donde deseas agregar los archivos y agrega el parámetro
resources
. Este parámetro acepta un arreglo de objetos tipoResource
. - Indicamos en el arreglo todos los archivos usando
process(_:localization:)
ocopy(_:)
. - Recuerda que también puedes agregar directorios completos, por ejemplo,
.copy("Directorio")
Cómo excluir recursos
En caso de querer indicar cuales recursos no deberían estar incluidos, podemos usar exclude
. Es otro parámetro de .target al igual que resources
, pero en vez de aceptar un arreglo de Resource
s, acepta un arreglo de String
s. Este también nos permite excluir directorios, por ejemplo:
exclude: ["imagen.png", "DirectorioExcluido"]
Aquí estamos excluyendo el archivo imagen.png y todo lo que esté en el directorio DirectorioExcluido.
Cómo usar recursos
Cuando agreguemos recursos a un target, Xcode automáticamente creará una extensión a Bundle
para agregar la variable estática module
. Esto nos permitirá acceder a nuestros recursos, por ejemplo, para mostrar una imagen:
Image("logo", bundle: Bundle.module)
.
También podemos usar:
Bundle.module.url(forResource: "config", withExtension: "plist")
.
En este caso para obtener un archivo .plist llamado config.
No debes utilizar cosas como Bundle.main
para acceder a tus recursos, ya que no está garantizado que funcione. Bundle.module
hace la búsqueda en todos los directorios posibles incluyendo Bundle.main.resourceURL
y Bundle.main.bundleURL
.
Ejemplo de un target con recursos agregados y excluidos
Para recapitular veamos un ejemplo en el que agregamos y excluimos recursos:
.target(name: "MyPackage",exclude: ["ExcludedFiles"],resources: [.process("Resources"),.copy("background.png"),])
En este caso indicamos que:
- Todos los archivos dentro del directorio ExcludedFiles deben ser excluidos.
- Queremos incluir los recursos dentro del directorio Resources y que estos deben ser procesados utilizando las reglas de Xcode para optimización.
- Que queremos copiar el archivo background.png sin ninguna optimización.