¿Qué es el Semantic Versioning?
El Semantic Versioning, o Semver, es un sistema de numeración de versiones que sigue un formato específico: X.Y.Z
. Cada componente de este formato tiene un significado:
X
: La versión principal (Major). Debe incrementarse cuando se hacen cambios incompatibles en la API.Y
: La versión secundaria (Minor). Se incrementa cuando se añaden nuevas funcionalidades de una manera compatible con las versiones anteriores.Z
: La versión de parche (Patch). Se incrementa cuando se hacen correcciones de errores
Ejemplo de Semantic Versioning
Para una comprensión más clara del Semantic Versioning, exploraremos cómo funcionan las versiones Major, Minor y Patch a través de ejemplos de código en un proyecto de desarrollo.
// 1.0.0
const getRandomNumber = (): number => {
return Math.random();
}
En este ejemplo, tenemos una función getRandmonNumber
en la versión 1.0.0
// 2.0.0
const getRandomNumber = ({ min, max }: {
min: number;
max: number;
}): number => {
if (isNaN(min) || isNaN(max)) {
throw new Error("Min and max are required");
}
if (min > max) {
throw new Error("Min must be less than max");
}
return Math.random() * (max - min) + min;
};
En este caso, hemos realizado un cambio significativo en la API que no es compatible con versiones anteriores, ya que hemos agregado soporte para un rango de valores min
y max
. Esto demanda una actualización Mayor de la versión de 1.0.0 a 2.0.0.
// 2.1.0
const getRandomNumber = ({ min = 0, max = 10 }: { // <-- Ahora min y max tienen valores por defecto
min?: number;
max?: number;
}): number => {
if (isNaN(min) || isNaN(max)) {
throw new Error("Min and max are required");
}
if (min > max) {
throw new Error("Min must be less than max");
}
return Math.random() * (max - min) + min;
};
En este ejemplo, hemos agregado valores por defecto para min
y max
, lo que no rompe la compatibilidad con la versión anterior, pero agrega una nueva funcionalidad. Por lo tanto, actualizamos la versión secundaria de 2.0.0 a 2.1.0.
// 2.1.1
const getRandomNumber = ({ min = 0, max = 10 }: {
min?: number;
max?: number;
}): number => {
if (isNaN(min) || isNaN(max)) {
throw new Error("Min and max are required");
}
if (min > max) {
throw new Error('Max must be greater than min'); // <-- Corregimos el texto de error
}
return Math.random() * (max - min) + min;
};
En este último ejemplo, hemos realizado una corrección en el texto de error, pero no se han realizado cambios importantes en la funcionalidad existente. Por lo tanto, actualizamos la versión de parche de 2.1.0 a 2.1.1.
Versiones Preliminares (Pre-releases)
Una de las características más útiles del Semantic Versioning es la capacidad de incluir versiones preliminares o pre-releases. Esto es especialmente útil cuando se está probando nuevas características o correcciones antes de lanzar una versión estable. Las versiones preliminares se indican con un sufijo, generalmente con un guion seguido de un identificador. Algunos ejemplos comunes de pre-releases son alpha
, beta
, rc
(release candidate) y dev
.
Aquí hay un ejemplo de cómo se podría utilizar un pre-release en Semantic Versioning:
2.0.0-alpha.1
: Esta es una versión preliminar de la próxima versión 2.0.0. Puede contener características experimentales que aún se están probando.2.0.0-beta.1
: Una versión beta de la 2.0.0, lo que significa que se han realizado cambios significativos y se espera que los usuarios prueben y den retroalimentación antes del lanzamiento oficial.2.0.0-rc.1
: Versión candidata para el lanzamiento oficial. Se supone que es muy estable, pero aún se están haciendo pruebas finales antes del lanzamiento principal.
En Resumen
El Semantic Versioning es una herramienta poderosa para gestionar las versiones de software de manera coherente y significativa. Permite a los desarrolladores y usuarios comprender rápidamente qué cambios se han realizado en una versión dada y cómo pueden afectar su software. Además, la inclusión de versiones preliminares facilita la prueba y retroalimentación de nuevas características antes de su lanzamiento oficial.