Cómo crear un monorepo de proyectos Node JS con Lerna

2 min
Cómo crear un monorepo de proyectos Node JS con Lerna

JustTasks

JustTasks es un gestor de tareas simple, sencillo y minimalista. ¡Eso es todo!

MongoDBExpressReactNode.JSGatsbyFlutter

Uno de mis proyectos personales a los que más tiempo le dediqué este 2021 fue JustTasks (repositorio en GitHub). Este simple gestor de tareas desarrollado puramente con JavaScript y diferentes frameworks ha sido el proyecto no profesional al que más horas le he dedicado y de los que más orgulloso me siento. Para daros un poco más contexto, el proyecto estaba divido en tres artefactos de software:

  • Una API desarrollada con Node JS y Express
  • Una aplicación web desarrollada con React
  • Una página estática desarrollada con Gatsby

Para el almacenamiento de los datos uso una base de datos MongoDB, principalmente por lo bien que se integra con tecnologías JS.

Como podéis ver, los tres proyectos utilizan tecnologías basadas en Node, los tres con sus package.json y su repositorio diferente. Esto hacia que las pruebas de integración, principalmente entre la aplicación y la webapp fueran bastante tediosas. La solución que llevaba buscando desde hace bastante tiempo era encontrar la forma de unificar los tres artefactos de software dentro de un mismo proyecto, algo similar a como se hace con los módulos de Maven.

Buscando información por Internet encontré Lerna, un gestor de proyectos JavaScript que funciona de una forma algo similar a como lo hacen Maven o Gradle con Java. Básicamente se basa en la creación de un monorepo, un mismo repositorio donde se localizan todos los artefactos de software necesarios para que el servicio funcione:

Monolito vs Multirepo vs Monorepo

Iniciando nuestro monorepo con Lerna

Empezamos instalando Lerna globalmente en nuestro sistema, aunque por lo que he podido investigar, parece que también se puede utilizar a través de npx:

npm install -g lerna

Puede que para ejecutar el comando anterior necesites permisos de administrador o de superusuario en algunos equipos. Una vez instalado Lerna, cramos un nuevo repositorio de git y lo vamos a convertir en un repositorio de Lerna:

git init justtasks
cd justtasks

lerna init

El último comando nos creará el skeleton de nuestro monorepo con dos archivos (package.json y lerna.json) y una carpeta (packages). ¿Para qué sirve todo esto? Veamos:

  • package.json: contiene información sobre la versión del monorepo e incluye la dependencia de “lerna”. También define el script de inicio del proyecto del cual hablaremos más adelante.
  • lerna.json: contiene información importante para la gestión de proyectos
  • packages: esta es la ruta donde deben de ir localizados cada uno de los artefactos de nuestro proyecto, en mi caso la API, la webapp y la web.

Todo el código lo podéis encontrar en GitHub.

Comandos de interés en Lerna

lerna bootstrap

Este comando es uno de los más interesantes que tiene Lerna. Básicamente instala las dependencias de todos paquetes y resuelve las dependencias entre ellos. Al fin y al cabo, cuando ejecutes la aplicación, se pueden llegar a usar versiones diferentes de una misma dependencia en diferentes paquetes.

Es fundamental que ejecutes este comando antes de ponerte a trabajar con tu repositorio.

lerna import <path>

Este comando importa un proyecto de Node en tu nuevo monorepo. Es muy útil para cuando ya tienes varios repositorios creados, uno para cada proyecto, y quieres fusionarlos todos con Lerna.

lerna run

Ejecuta el comando run que hay en cada paquete del repositorio. Esto sirve para arrancar cada uno de los artefactos de software a la misma vez y poder desarrollar con todos ellos funcionando sin tener que levantar cada uno por separado. Te recomiendo que utilices la opción --stream para que se muestren los logs de cada uno de los paquetes por la terminal.

¿Más información? Visita el repositorio de Lerna en GitHub.