Sourcery para Swift: Guía completa de generación de código
1. ¿Qué es y para qué sirve?
Sourcery es una potente herramienta de generación de código para el lenguaje Swift, creada por Krzysztof Zabłocki y su equipo. Permite generar automáticamente código repetitivo (boilerplate code) basándose en anotaciones y la estructura de tus archivos fuente. En lugar de escribir manualmente implementaciones repetitivas de protocolos como Equatable, Hashable, Codable, objetos mock para pruebas o código para Auto Layout, describes las reglas de generación una vez y Sourcery hace el resto.
¿Para qué sirve? En proyectos reales de Swift, una gran parte del código es mecánica y repetitiva. Esto no solo consume tiempo del desarrollador, sino que también es fuente de errores: olvidaste agregar un nuevo campo en Equatable y obtienes un bug. Sourcery resuelve este problema encargándose de la rutina. Analiza tu código (AST — árbol de sintaxis abstracta) y, basándose en plantillas (Stencil o basadas en Swift), genera nuevos archivos. Esto es especialmente útil en proyectos grandes con decenas o cientos de modelos, ViewControllers o servicios.
Sourcery no es una biblioteca en tiempo de ejecución, sino una herramienta en tiempo de compilación. Lo ejecutas como parte del proceso de compilación (a través de Build Phase en Xcode o mediante SPM/Tuist), genera archivos, y luego esos archivos se compilan junto con el resto del código. Este enfoque garantiza cero overhead en tiempo de ejecución y total previsibilidad.
2. Instalación
Existen varias formas de instalar Sourcery. La más sencilla y recomendada es a través de Homebrew:
brew install sourcery
Para proyectos que usan Swift Package Manager (SPM), se puede agregar Sourcery como plugin. Sin embargo, lo más común es usarlo como un binario independiente, invocado desde un script de compilación. Para instalarlo mediante Mint (gestor de paquetes para herramientas Swift):
mint install krzysztofzablocki/Sourcery
También puedes descargar el binario listo desde GitHub Releases y colocarlo en la carpeta de tu proyecto. Después de la instalación, verifica que el comando esté disponible:
sourcery --version
3. Inicio rápido — ejemplo mínimo funcional
Vamos a crear un ejemplo sencillo: generación automática de la implementación del protocolo Equatable para una estructura.
Paso 1: Crea un archivo con el código fuente (por ejemplo, Sources/Models/User.swift):
import Foundation
// sourcery: AutoEquatable
struct User {
let id: Int
let name: String
let email: String
}
Observa el comentario // sourcery: AutoEquatable — es una anotación que le indica a Sourcery que debe generar la implementación de Equatable para esta estructura.
Paso 2: Crea la plantilla (por ejemplo, Templates/AutoEquatable.stencil):
// Generado por Sourcery
// swiftlint:disable all
{% for type in types.all where type.annotations.AutoEquatable %}
extension {{ type.name }}: Equatable {
static func == (lhs: {{ type.name }}, rhs: {{ type.name }}) -> Bool {
{% for variable in type.storedVariables %}
{% if not forloop.first %} && {% endif %}lhs.{{ variable.name }} == rhs.{{ variable.name }}
{% endfor %}
}
}
{% endfor %}
Paso 3: Ejecuta Sourcery:
sourcery --sources Sources/Models --templates Templates --output Generated
Paso 4: Resultado — en la carpeta Generated aparecerá el archivo AutoEquatable.generated.swift:
// Generado por Sourcery
// swiftlint:disable all
extension User: Equatable También en la biblioteca
ORM para Rust: comparativa de Diesel, SeaORM, SQLx y ejemplos de código
Gradle Kotlin DSL: guía completa con ejemplos para Kotlin
Monitoreo de aplicaciones PHP con PHPMetrics