Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Versionado y Publicación
Lerna puede incrementar las versiones de tus paquetes y publicarlos en NPM, además de ofrecer diversas opciones para adaptarse a cualquier flujo de trabajo.
Para mostrar cómo lo hace Lerna, examinaremos este repositorio.
Si aprendes mejor haciendo, clona el repositorio y sigue los pasos.
El repositorio contiene tres paquetes o proyectos:
-
header(una biblioteca de componentes React) -
footer(una biblioteca de componentes React) -
remixapp(una aplicación creada con el framework Remix que depende deheaderyfooter)
Vamos a publicar los paquetes header y footer.
Es común publicar solo un subconjunto de los proyectos. Algunos pueden ser privados (ej. para pruebas), otros pueden ser aplicaciones demo. En este repo,
remixappno es "privado" en el sentido de ocultar su código fuente, simplemente usa"private": truepara evitar su publicación en NPM.
Versionado
Lerna incluye el comando version que permite incrementar el número de versión de tus paquetes, confirmar los cambios y etiquetarlos adecuadamente.
lerna version --no-private
obtendrás la siguiente salida:
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) (Use arrow keys)
❯ Patch (1.0.1)
Minor (1.1.0)
Major (2.0.0)
Prepatch (1.0.1-alpha.0)
Preminor (1.1.0-alpha.0)
Premajor (2.0.0-alpha.0)
Custom Prerelease
Custom Version
Nota que al pasar --no-private excluimos todos los paquetes marcados como private en su archivo package.json.
Lerna detecta los paquetes actuales, identifica la versión vigente y propone la siguiente opción. También puedes especificar directamente un incremento semver como lerna version 1.0.0. Más detalles en la documentación de versionado. Al elegir una versión, Lerna actualiza el package.json, confirma el cambio, añade una etiqueta de versión (ej. v1.0.0) y envía el commit y la etiqueta al repositorio remoto.
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}
Nota que esta operación no publica el paquete en NPM. Si queremos que Lerna gestione también la publicación, usaremos lerna publish.
Lerna usa la propiedad version en lerna.json para determinar la versión actual
Publicación en NPM
Si ejecutamos
lerna publish --no-private
Lerna ejecuta el flujo de incremento de versión (igual que lerna version) y además publica los paquetes en NPM. Deberías ver esta salida:
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) Patch (1.0.1)
Changes:
- footer: 1.0.0 => 1.0.1
- header: 1.0.0 => 1.0.1
? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
...
lerna success published header 1.0.1
...
lerna success published footer 1.0.1
...
Successfully published:
- footer@1.0.1
- header@1.0.1
lerna success published 2 packages
from-package
Otra forma en que Lerna determina qué paquetes publicar es mediante from-package. Compara la versión de cada paquete local con su versión publicada en npm. Para cada paquete con versión superior a la publicada, Lerna lo publica en npm.
Este modo no requiere explícitamente que los paquetes hayan sido versionados con lerna version, lo que lo hace ideal para espacios de trabajo con sus propios scripts de versionado.
lerna publish from-package
Lerna siempre usa npm para publicar paquetes. Si usas un gestor de paquetes diferente de npm, aún necesitarás agregar la configuración de publicación apropiada a .npmrc, incluso si npmClient está configurado con algo distinto a npm en lerna.json.
Estrategias de versionado
Lerna permite gestionar tu proyecto en dos modos: Fijo o Independiente.
Modo Fijo/Blocado (predeterminado)
Los proyectos de Lerna en modo fijo operan con una única línea de versiones. La versión se mantiene en el archivo lerna.json en la raíz de tu proyecto bajo la clave version. Cuando ejecutas lerna publish, si un paquete ha sido actualizado desde el último lanzamiento, se actualizará a la nueva versión que estás publicando. Esto significa que solo publicas una nueva versión de un paquete cuando es necesario.
Nota: Si tienes una versión principal cero, todas las actualizaciones se consideran rompedoras. Debido a esto, ejecutar
lerna publishcon una versión principal cero y elegir cualquier número de versión que no sea prelanzamiento hará que se publiquen nuevas versiones para todos los paquetes, incluso si no todos han cambiado desde el último lanzamiento.
Usa este modo si quieres vincular automáticamente todas las versiones de paquetes. Un inconveniente de este enfoque es que un cambio importante en cualquier paquete hará que todos los paquetes reciban una nueva versión principal.
Versiones sincronizadas
Lerna solo versionará y publicará paquetes que hayan cambiado desde el lanzamiento anterior, lo que puede hacer que las versiones de los paquetes se desfasen con el tiempo. Para evitarlo, usa la opción --force-publish con lerna version. Esto forzará a Lerna a versionar siempre todos los paquetes, independientemente de si han cambiado desde el último lanzamiento. Luego todos se publicarán en el registro mediante lerna publish from-git. Como resultado, todas las versiones de paquetes permanecerán sincronizadas con la versión en lerna.json.
Modo independiente
npx lerna init --independent
Los proyectos de Lerna en modo independiente permiten a los mantenedores incrementar las versiones de los paquetes de forma independiente. Cada vez que publiques, se te pedirá que especifiques para cada paquete modificado si el cambio es un parche, una actualización menor, mayor o personalizada.
El modo independiente te permite actualizar versiones de forma más granular para cada paquete, lo que tiene sentido para grupos de componentes. Combinar este modo con herramientas como semantic-release simplificaría el proceso (existen avances en este enfoque en atlassian/lerna-semantic-release).
Establece la clave
versionenlerna.jsoncomoindependentpara operar en modo independiente.