Volver a la página principal
miércoles 13 noviembre 2024
15

Trabajando con Monorepos con Turbo

El uso de monorepos en el desarrollo de software ha ganado popularidad en los últimos años, especialmente en equipos que gestionan proyectos grandes y múltiples paquetes. Las herramientas de construcción para monorepos, como Turbo (anteriormente conocido como Turborepo), permiten gestionar y optimizar proyectos complejos de manera eficiente, ahorrando tiempo y reduciendo la duplicación de dependencias.

¿Qué es un Monorepo?

Un monorepo (o repositorio monolítico) es un único repositorio de código que contiene múltiples paquetes o servicios de un proyecto. En lugar de separar cada paquete en un repositorio independiente, un monorepo los aloja todos juntos. Esta estructura facilita la administración de dependencias compartidas, la alineación en versiones de librerías internas y la coherencia en configuraciones de herramientas.

¿Por qué usar un Monorepo?

El uso de un monorepo trae consigo ventajas importantes:

  • Facilidad de colaboración: Todos los paquetes están en un solo repositorio, lo que facilita la sincronización y revisión del código entre equipos.
  • Reutilización de código: Es más sencillo compartir código común entre múltiples proyectos sin tener que gestionar múltiples repositorios.
  • Gestión de dependencias unificada: Evita problemas de compatibilidad de dependencias al tener versiones sincronizadas.
  • Control de versiones y releases: Se pueden hacer lanzamientos coordinados de los distintos paquetes que se versionan conjuntamente.

Sin embargo, gestionar un monorepo requiere herramientas adecuadas para evitar problemas de escalabilidad y complejidad en las dependencias. Aquí es donde entra Turbo.

¿Qué es Turbo?

Turbo es una herramienta moderna para gestionar monorepos, que facilita la optimización de tareas repetitivas y la construcción de múltiples paquetes dentro de un mismo repositorio. Turbo optimiza el proceso de construcción y prueba mediante:

  • Caché inteligente: Turbo almacena el resultado de tareas previamente ejecutadas y las reutiliza cuando no hay cambios en el código relevante, acelerando el tiempo de construcción.
  • Ejecución paralela: Turbo permite ejecutar tareas en paralelo, aprovechando al máximo el hardware disponible.
  • Pipeline de tareas: Permite configurar tareas y sus dependencias en un flujo ordenado y eficiente.
Nota: Turbo es especialmente popular en proyectos que usan JavaScript/TypeScript, aunque también se puede utilizar con otras tecnologías.

Ventajas de usar Turbo en un Monorepo

  • Aumento de velocidad en CI/CD: Turbo optimiza las compilaciones y las pruebas, lo cual es fundamental para un flujo de trabajo CI/CD rápido.
  • Reducción de tiempos de compilación: Al almacenar los resultados de tareas y reutilizarlos, Turbo reduce significativamente el tiempo necesario para compilar y construir paquetes.
  • Mejor escalabilidad: A medida que el monorepo crece, Turbo facilita el manejo de múltiples paquetes sin que los tiempos de construcción se vuelvan insostenibles.

Configuración Inicial de Turbo

Para comenzar a trabajar con Turbo en un monorepo, es necesario instalarlo y configurarlo en nuestro proyecto. A continuación, te explico los pasos iniciales para configurar un monorepo con Turbo.

Paso 1: Crear la Estructura de Monorepo

Lo primero que necesitamos es una estructura de monorepo. Para esto, podemos utilizar herramientas como Nx, Yarn Workspaces o npm Workspaces.

Supongamos que usamos Yarn Workspaces. La estructura de nuestro proyecto podría verse así:

my-monorepo/
│
├── packages/
│   ├── package-a/
│   └── package-b/
│
├── apps/
│   ├── app-1/
│   └── app-2/
│
├── turbo.json
└── package.json

En este ejemplo, tenemos dos carpetas principales: packages y apps. Cada una contiene subproyectos, como paquetes (package-a, package-b) y aplicaciones (app-1, app-2).

Paso 2: Instalar Turbo

Instala Turbo como una dependencia de desarrollo en la raíz de tu monorepo:

yarn add -D turbo
Consejo: También puedes instalar Turbo globalmente si deseas usarlo en varios proyectos.

Paso 3: Configurar el Archivo turbo.json

El archivo turbo.json es donde especificamos las configuraciones para Turbo, incluyendo el caché y las dependencias de las tareas. Aquí tienes un ejemplo básico:

{
  "$schema": "https://turbo.build/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": []
    },
    "lint": {
      "outputs": []
    }
  }
}

En este ejemplo:

  • La tarea build depende de la tarea build de sus paquetes ancestros, indicada con ^build.
  • La tarea test depende de que la tarea build haya sido ejecutada primero.
  • Lint no depende de otras tareas y no genera salidas.

Esta configuración permite que Turbo ejecute las tareas en el orden correcto y almacene en caché los resultados cuando sea posible.

Ejecución de Tareas con Turbo

Una vez que Turbo está configurado, ejecutar tareas es muy sencillo. Puedes usar los siguientes comandos en la raíz del monorepo:

  • Ejecutar build: Para construir todos los paquetes y aplicaciones en el monorepo, usa:
turbo run build
  • Ejecutar pruebas: Si deseas ejecutar las pruebas en todo el monorepo, ejecuta:
turbo run test
  • Ejecución en paralelo: Turbo ejecuta automáticamente tareas independientes en paralelo, optimizando el uso del hardware.
Tip: Al usar el caché de Turbo, las tareas que no han cambiado no se vuelven a ejecutar, acelerando el proceso de forma significativa. 🚀

Optimización de Flujo de Trabajo con Turbo en CI/CD

Uno de los mayores beneficios de usar Turbo en un monorepo es la mejora en los tiempos de ejecución de pipelines CI/CD. Para implementar Turbo en CI/CD, sigue estos pasos:

1. Configurar el Caché Remoto: Turbo permite el uso de un caché remoto para que los resultados de tareas se compartan entre diferentes entornos (como estaciones de trabajo y servidores de CI). Para esto, necesitarás un proveedor de caché, como Vercel o almacenamiento en la nube.

2. Configuración en el Pipeline: En el archivo de configuración de tu pipeline (por ejemplo, .github/workflows/ci.yml), asegúrate de que Turbo use el caché adecuado y ejecute las tareas en paralelo:

steps:
     - name: Configurar Turbo Cache
       run: turbo login
     - name: Instalar Dependencias
       run: yarn install
     - name: Ejecución de Tests
       run: turbo run test
     - name: Build
       run: turbo run build

Esto asegurará que el caché de Turbo acelere las compilaciones y pruebas en tu pipeline CI/CD.

Buenas Prácticas al Usar Turbo en Monorepos

Trabajar con monorepos y Turbo puede ser un cambio importante en la forma en que gestionamos nuestros proyectos. Aquí tienes algunas buenas prácticas para maximizar el potencial de Turbo:

  • Configura dependencias de tareas cuidadosamente: Asegúrate de definir bien las dependencias entre tareas en turbo.json para evitar que se ejecuten tareas innecesarias.
  • Aprovecha el caché al máximo: Usa un caché remoto en CI/CD para reducir tiempos de compilación en diferentes entornos.
  • Mantén un monorepo modular: Aunque todo el código esté en un mismo repositorio, intenta que cada paquete o aplicación sea modular e independiente.

Conclusión

Implementar Turbo en un monorepo puede revolucionar el flujo de trabajo en equipos de desarrollo, aumentando la eficiencia y reduciendo tiempos de construcción de manera significativa. Al aprovechar la capacidad de Turbo para gestionar tareas, el caché inteligente y la ejecución paralela, es posible escalar proyectos complejos sin comprometer la velocidad y la coherencia.

Si tienes un proyecto grande con múltiples paquetes o aplicaciones, considera probar Turbo. Esta herramienta se adapta perfectamente a monorepos, optimizando cada paso de la construcción y permitiendo que los equipos se concentren en el código sin perder tiempo en procesos repetitivos. ¡Dale una oportunidad a Turbo y experimenta una forma más ágil de desarrollar! 😎

Etiquetas:
turbo
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer