Ir al contenido

Migrar un proyecto de Bazel

Bazel es un sistema de compilación que Google hizo de código abierto en 2015. Es una herramienta potente que te permite compilar y probar software de cualquier tamaño de forma rápida y fiable. Algunas grandes organizaciones como Spotify, Tinder o Lyft lo utilizan; sin embargo, requiere una inversión inicial (es decir, aprender la tecnología) y continua (es decir, mantenerse al día con las actualizaciones de Xcode) para introducirlo y mantenerlo. Aunque esto funciona para algunas organizaciones que lo tratan como una preocupación transversal, puede no ser la mejor opción para otras que quieren centrarse en el desarrollo de su producto. Por ejemplo, hemos visto organizaciones cuyo equipo de plataforma iOS introdujo Bazel y tuvo que abandonarlo después de que los ingenieros que lideraron el esfuerzo dejaran la empresa. La postura de Apple sobre el fuerte acoplamiento entre Xcode y el sistema de compilación es otro factor que dificulta el mantenimiento de los proyectos de Bazel con el tiempo.

La singularidad de Tuist reside en su sutileza

En lugar de luchar contra Xcode y los proyectos de Xcode, Tuist los adopta. Se basa en los mismos conceptos (por ejemplo, targets, esquemas, ajustes de compilación), un lenguaje familiar (es decir, Swift) y una experiencia sencilla y agradable que hace que el mantenimiento y la escalabilidad de los proyectos sean responsabilidad de todo el mundo y no solo del equipo de plataforma iOS.

Reglas#

Bazel utiliza reglas para definir cómo compilar y probar software. Las reglas se escriben en Starlark, un lenguaje similar a Python. Tuist utiliza Swift como lenguaje de configuración, lo que ofrece a los desarrolladores la comodidad de usar las funciones de autocompletado, comprobación de tipos y validación de Xcode. Por ejemplo, la siguiente regla describe cómo compilar una biblioteca de Swift en Bazel:

plaintext
swift_library(
name = "MyLibrary.library",
srcs = glob(["**/*.swift"]),
module_name = "MyLibrary"
)
swift
let project = Project(
// ...
targets: [
.target(name: "MyLibrary", product: .staticLibrary, sources: ["**/*.swift"])
]
)

Aquí tienes otro ejemplo, pero comparando cómo definir tests unitarios en Bazel y Tuist:

plaintext
ios_unit_test(
name = "MyLibraryTests",
bundle_id = "dev.tuist.MyLibraryTests",
minimum_os_version = "16.0",
test_host = "//MyApp:MyLibrary",
deps = [":MyLibraryTests.library"],
)
swift
let project = Project(
// ...
targets: [
.target(
name: "MyLibraryTests",
destinations: .iOS,
product: .unitTests,
bundleId: "dev.tuist.MyLibraryTests",
sources: "Tests/MyLibraryTests/**",
dependencies: [
.target(name: "MyLibrary"),
]
)
]
)

Dependencias de Swift Package Manager#

En Bazel, puedes usar el plugin rules_swift_package_managerGazelle para utilizar paquetes de Swift como dependencias. El plugin requiere un Package.swift como fuente única de verdad para las dependencias. La interfaz de Tuist es similar a la de Bazel en ese sentido. Puedes usar el comando tuist install para resolver y obtener las dependencias del paquete. Una vez completada la resolución, puedes generar el proyecto con el comando tuist generate.

bash
tuist install # Fetch dependencies defined in Tuist/Package.swift
tuist generate # Generate an Xcode project

Generación del proyecto#

La comunidad proporciona un conjunto de reglas, rules_xcodeproj, para generar proyectos de Xcode a partir de proyectos declarados en Bazel. A diferencia de Bazel, donde necesitas añadir cierta configuración a tu archivo BUILD, Tuist no requiere ninguna configuración. Puedes ejecutar tuist generate en el directorio raíz de tu proyecto y Tuist generará un proyecto de Xcode por ti.