Caret vs Tilde en paquete.json

El archivo package.json es el corazón de todos los paquetes npm y no importa lo que tenga en su proyecto, una cosa es segura: siempre habrá un paquete....

El archivo package.json es el corazón de todos los paquetes npm y no importa lo que tenga en su proyecto, una cosa es segura: siempre habrá un archivo package.json. De las muchas cosas que contiene el archivo paquete.json, la gestión de dependencias es de lo que vamos a hablar hoy.

Creo que la mayoría de los desarrolladores estarían de acuerdo en que administrar las dependencias nunca fue una tarea fácil en los primeros días de los lenguajes de alto nivel como JavaScript. Simplemente pregúntele a un desarrollador de Java cómo era la vida antes de que apareciera Maven; o tal vez hable con un desarrollador de Ruby sobre el impacto que tiene RubyGems en su desarrollo. Lo mismo ocurre con los desarrolladores de Node.js. Sin la administración de dependencias de npm y package.json, la vida no sería tan fácil.

Símbolos de intercalación y tildes en números de versión

Dentro de cada proyecto respaldado por npm, las dependencias se rastrean y administran dentro de un archivo package.json a través de la propiedad JSON "dependencies". Normalmente, estas dependencias son bastante sencillas y fáciles de entender. Aunque ocasionalmente puede notar cambios en los números de versión después de usar la opción --save en package.json. Mirando más a fondo, es posible que vea que los números de versión ahora tienen un carácter desconocido antes de ellos.

Específicamente, podrías terminar con algo como:

1
2
3
"dependencies": {
  "express": "^3.9.2"
}

O otra posibilidad es:

1
2
3
"dependencies": {
  "express": "~3.9.2"
}

Entonces, ¿qué está haciendo este personaje "^" (o "~") allí arriba? No se preocupe, es bastante simple e intentaré explicarlo.

Los caracteres que vienen antes de los números de versión son prefijos a los que nos referimos como signos de intercalación (^) y tilde (~). Los agregan los desarrolladores (o npm) para indicar restricciones sobre qué números de versión de software se pueden usar como una dependencia en su proyecto. Estos esquemas numéricos siguen una convención conocida como versionado semántico, o semver. Los números reales en sí mismos se utilizan en el sistema de control de versiones para indicar el tipo de cambios realizados que llevaron al incremento del número de versión. Los números (3, 9 y 2) en el ejemplo anterior se denominan números mayor, menor y de parche de izquierda a derecha.

Antes de entrar en los detalles de lo que realmente significan el signo de intercalación y la tilde, veamos una descripción general rápida de cuándo se debe incrementar cada uno de los dígitos en los números de versión a medida que se realizan cambios en una base de código:

  1. Los cambios incompatibles con versiones anteriores incrementan el dígito principal.
  2. Si se realiza un cambio nuevo (compatible con versiones anteriores), el dígito menor se incrementa.
  3. Las correcciones de errores simples (a la funcionalidad existente) incrementan el dígito del parche.

Cuando ejecuta npm install en un directorio de proyecto limpio, la versión de software más alta disponible para una dependencia que puede satisfacer el número de versión proporcionado en package.json se instala para cada dependencia. Entonces, si no se da ^ o ~, entonces se usa el número de versión exacto dado.

Sin embargo, al no especificar la versión de dependencia precisa en el archivo package.json y usar los signos de intercalación (^) o tilde (~), npm le permite ampliar el rango de versiones aceptadas. Cuando se usa el indicador --save, la funcionalidad predeterminada es prefijar la versión con el signo de intercalación. Y por supuesto, esto se puede configurar con el parámetro de prefijo guardado.

Con respecto a las versiones semánticas, aquí hay un desglose de los cambios en la base de código que permitirá el signo de intercalación:

Caret permite...

  • Nuevas funcionalidades compatibles con versiones anteriores
  • Gran refactor interno
  • Corrección de errores
  • Obsolescencia de la funcionalidad anterior (que aún está operativa)

Con el signo de intercalación puede obtener versiones como 3.., donde los caracteres * coincidirán con el número de versión más alto disponible. Por lo tanto, los cambios en el dígito mayor, como 4.0.0, no se utilizarán en este caso.

Tilde permite...

  • Corrección de errores

Con tilde, puede obtener versiones como 3.9.*. Solo se permiten las últimas correcciones de errores con la tilde.

Entonces, podemos concluir diciendo que el carácter ~ debe usarse si desea bloquear el número de parche. Debe usar esto cuando esté listo para aceptar solo correcciones de errores y no quiera enfrentar alteraciones posiblemente incompatibles. Por otro lado, el carácter ^ es responsable de bloquear el parche y los números de versión menores. Se debe usar cuando desee tener una nueva funcionalidad compatible con versiones anteriores, así como correcciones de errores.

Conclusión

Tenga en cuenta que las versiones muy antiguas de npm no son compatibles con ^, así que utilícelo con precaución. Aunque, cualquiera de las versiones de npm lanzadas en el último año debería estar bien. En la mayoría de los casos, esto no debería afectarte.

Realmente no hay una "mejor opción" aquí, ya que ambas tienen sus usos en diferentes escenarios. Todo depende de los requisitos de su proyecto y de sus preferencias personales. El simple hecho de conocer esta función en semver y npm puede ahorrarle muchos dolores de cabeza, así como algo de tiempo al evitar que tenga que actualizar constantemente sus versiones de dependencia de forma manual.

  • ¿Tiene una opción preferida? ¿Ha tenido una mala experiencia con el uso del signo de intercalación o la tilde? ¡Cuéntanos en los comentarios!*