Buonasera a tutti!!
Hoy quiero hablar un poquito sobre esta maravilla de Lerna.
Lerna es una herramienta que te permite gestionar varios paquetes npm en un solo repositorio, basicamente en un monorepo.
Por qué un monorepo?
Tener un monorepo nos facilita muchisimo la manera de coordinar cambios entre multiples paquetes con dependencias entre ellos.
Realmente es recomendable tener un monorepo?
En este articulo que les dejo a continuación el equipo de Babel menciona sus motivos y explica por qué ellos lo recomiendan. Link: Click aqui
Quienes usan monorepo en sus proyectos?
Existen muchos proyectos importantes que lo implementan, entre ellos Angular, React, Babel, Apollo, Jest, entre otros.
Como puedo tener mi propio monorepo con Lerna?
Vamos por partes:
1. Instalación y configuración.
Instalamos Lerna en global.
1 | npm i -g lerna |
1 | mkdir lerna-example |
1 | lerna init |
1 | ├── lerna.json |
2. Creando los paquetes
A continuación, crearemos la siguiente estructura de proyecto que consta de 3 paquetes (test1, test2, test3).1 | ├── lerna.json |
En cada una de las carpetas (test1, test2, test3) hacemos un npm init con los valores por defecto.
Después con los index.js, lo que vamos hacer es que los paquetes test1 y test2 sean independientes y que test3 tenga de dependencia a ambos.
1 | // packages/test1/index.js |
1 | // packages/test2/index.js |
1 | // packages/test3/index.js |
1 | node packages/test3/index.js |
1 | { |
3. Bootstrap
Ahora ejecutamos lerna bootstrap que va a instalar las dependencias de nuestros paquetes y los va a enlazar entre ellos.Si miramos la estructura de directorios vemos que ha aparecido node_modules dentro de test3 con enlaces simbólicos a test1 y test2.
Si ejecutamos node packages/test3/index.js funcionará correctamente.
Ya estamos listos para publicar la primera versión, pero antes de continuar tenemos que añadir un repo remoto (git remote add...) comiteamos y hacemos push.
Ejecutamos lerna changed que nos informa que los paquetes test1, test2 y test3 están preparados para publicarse.
1 | ├── lerna.json |
1 | node packages/test3/index.js |
3.Versiones
Ya estamos listos para publicar la primera versión, pero antes de continuar tenemos que añadir un repo remoto (git remote add...) comiteamos y hacemos push.
Ejecutamos lerna changed que nos informa que los paquetes test1, test2 y test3 están preparados para publicarse.
Ahora publicamos, para ello ejecutamos lerna version.
Lo primero que hace es decirnos qué tipo de versión queremos lanzar (patch, minor, major etc), en nuestro caso elegimos major la 1.0.0, pero como es el valor por defecto del npm init los package.json no son modificados. Lerna nos creará el tag 1.0.0 y hace push en nuestro repo.
Existe una alternativa a lerna version que es lerna publish que además de actualizar nuestro repo actualizará nuestras biblotecas en npm.
A continuación, haremos cambios en nuestras dependencias para ver cómo lo maneja Lerna.
Vamos a actualizar test1 con el siguiente contenido:
Hacemos commit, push y volvemos a ejecutar lerna changed.
Vemos que Lerna nos informa que tenemos cambios en test1 y test3, pero no de test2 porque no depende de test1 como si sucede con test3. Lerna nos indica que si vamos a publicar una nueva versión de test1 podemos hacerlo también de test3.
Publicamos la nueva versión con lerna version, esta vez como una minor.
Lerna ha actualizado la versión de los package.json de los paquetes afectados y ha hecho commit y push del nuevo tag 1.1.0.
Este es el ´git diff´ del último commit.
Lo primero que hace es decirnos qué tipo de versión queremos lanzar (patch, minor, major etc), en nuestro caso elegimos major la 1.0.0, pero como es el valor por defecto del npm init los package.json no son modificados. Lerna nos creará el tag 1.0.0 y hace push en nuestro repo.
Existe una alternativa a lerna version que es lerna publish que además de actualizar nuestro repo actualizará nuestras biblotecas en npm.
A continuación, haremos cambios en nuestras dependencias para ver cómo lo maneja Lerna.
Vamos a actualizar test1 con el siguiente contenido:
1 | // packages/test1/index.js |
Vemos que Lerna nos informa que tenemos cambios en test1 y test3, pero no de test2 porque no depende de test1 como si sucede con test3. Lerna nos indica que si vamos a publicar una nueva versión de test1 podemos hacerlo también de test3.
Publicamos la nueva versión con lerna version, esta vez como una minor.
Lerna ha actualizado la versión de los package.json de los paquetes afectados y ha hecho commit y push del nuevo tag 1.1.0.
Este es el ´git diff´ del último commit.
Por último, otro comando muy práctico es lerna add que nos permite añadir dependencias en uno o varios de nuestros paquetes.
Por ejemplo, si ejecutamos lerna add babel-core nos añadirá babel-core en nuestros 3 paquetes, pero si solo queremos hacerlo en uno podemos indicarle un scope lerna add babel-core --scope=test2.
Por ejemplo, si ejecutamos lerna add babel-core nos añadirá babel-core en nuestros 3 paquetes, pero si solo queremos hacerlo en uno podemos indicarle un scope lerna add babel-core --scope=test2.