Gestiona las versiones de un monorepo y crea un changelog

Librería changesets para gestionar las versiones de un monorepo con PNPM.

changesets-changelog-paquetes-monorepo-pnpm

Cuando trabajamos en proyectos, especialmente en monorepos que contienen múltiples paquetes, es esencial llevar un registro detallado de los cambios realizados. Esto ayuda a mantener control sobre las versiones y proporciona transparencia respecto a lo que se publica. La librería @changesets facilita este proceso al integrarse con el versionado semántico (SemVer), permitiéndonos registrar cambios y generar automáticamente un changelog al publicar nuevas versiones de nuestros paquetes.

A continuación, te explicaremos cómo funciona y cómo puedes usar esta herramienta en un caso práctico.

Instalación y configuración inicial

Para empezar a usar @changesets, primero debes inicializarlo en tu proyecto. Puedes hacerlo ejecutando el siguiente comando:

Terminal
pnpm add -Dw @changesets/cli
pnpm changeset init

Se creará una carpeta llamada .changeset en la raíz del proyecto. Y dentro de esta carpeta, encontrarás un archivo de configuración llamado config.json. Aquí puedes personalizar el comportamiento de la herramienta.

El archivo config.json básico tendrá un contenido como este:

{
"$schema": "https://unpkg.com/@changesets/[email protected]/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"access": "restricted",
"baseBranch": "main",
"updateInternalDependencies": "patch"
}
  • changelog: Indica cómo se generará el changelog (puedes deshabilitarlo o usar el formato predeterminado).
  • commit: Si está activado, genera automáticamente un commit al agregar un changeset.
  • access: Define el nivel de acceso para publicar los paquetes (restricted para paquetes privados y public para públicos).
  • baseBranch: Especifica la rama base del proyecto (generalmente main o master).
  • updateInternalDependencies: Controla cómo se actualizan las dependencias internas entre paquetes.

Ejemplo de trabajo con @changesets

Una vez instalado vamos a ver un ejemplo práctico:

Paso 1: Realizar cambios y crear un changeset

Cada vez que realices cambios en uno o más paquetes, debes agregar un changeset para describir esos cambios. Hazlo ejecutando el siguiente comando:

Terminal
pnpm changeset

Esto abrirá un asistente interactivo donde se te pedirá:

  1. Seleccionar los paquetes que se modificaron.
  2. Indicar el nivel de versión que debe incrementarse según SemVer:
    • Major (versión principal, x.0.0): Cambios que rompen compatibilidad.
    • Minor (versión secundaria, 0.x.0): Nuevas funcionalidades compatibles.
    • Patch (parche, 0.0.x): Correcciones o cambios menores.
  3. Escribir un resumen de los cambios realizados que luego aparecerán en el changelog.

Esto generará un archivo en la carpeta .changeset. Un ejemplo de archivo podría ser:

---
"paquete-1": minor
"paquete-2": patch
---
Se agregó una nueva funcionalidad a `paquete-1` y se corrigió un error menor en `paquete-2`.

Paso 2: Revisar y combinar changesets

Si estás trabajando en equipo, probablemente trabajes en ramas separadas. Cada branch puede contener su propio changeset. Cuando las ramas se fusionan, los archivos de changesets se combinan automáticamente.

Paso 3: Generar nuevas versiones

Una vez que los cambios estén listos para publicarse, ejecuta el comando:

Terminal
pnpm changeset version
  • Se incrementarán automáticamente las versiones de los paquetes afectados según lo indicado en los changesets.
  • Se modificarán los archivos package.json y changelog.md de cada paquete.

Por ejemplo, si tienes la siguiente estructura inicial:

monorepo/
├── packages/
│ ├── paquete-1/
│ │ ├── package.json
│ │ ├── index.js
│ ├── paquete-2/
│ ├── package.json
│ ├── index.js
└── .changeset/

Después de ejecutar el comando, los package.json de los paquetes afectados tendrán versiones incrementadas y el changelog será actualizado.

Paso 4: Publicar los paquetes

Finalmente, puedes publicar las nuevas versiones usando el comando:

Terminal
pnpm publish

Esto publicará los paquetes en el registro de npm (o cualquier otro configurado) con las versiones generadas.

Conclusión

Con este flujo de trabajo, puedes gestionar versiones y changelogs de manera eficiente en tu proyecto o monorepo. ¡Listo para mantener un historial claro y organizado de tus cambios!