[Javascript] ¿Cuál es la diferencia entre tilde (~) y caret (^) en package.json?


Answers

Me gustaría agregar también la documentación oficial de npmjs que describe todos los métodos para la especificidad de la versión, incluidos los referidos en la pregunta:

https://www.npmjs.org/doc/files/package.json.html

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version "Aproximadamente equivalente a la versión" Ver npm semver - Tilde Ranges & sempre (7)
  • ^version "Compatible con la versión" Ver npm semver - Caret Ranges & sempre (7)
  • version debe coincidir exactamente con la versión
  • >version debe ser mayor que la versión
  • >=version etc.
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1, etc., pero no 1.3.0
  • http://sometarballurl (puede ser la URL de un tarball que se descargará e instalará localmente)
  • * Coincide con cualquier versión
  • latest versión Obtiene el último lanzamiento

La lista de arriba no es exhaustiva. Otros especificadores de versiones incluyen las URL de GitHub y los repositorios de usuario de GitHub, rutas locales y paquetes con etiquetas npm específicas

Question

Después de actualizar al último node estable y npm , probé el npm install moment --save . Guarda la entrada en el package.json con el prefijo de caret(^) . Anteriormente, era un prefijo tilde(~) .

  1. ¿Por qué se hacen estos cambios en npm ?
  2. ¿Cuál es la diferencia entre tilde(~) y caret(^) ?
  3. ¿Cuáles son las ventajas sobre los demás?



~ Tilde:

  • ~ arregla números mayores y menores.
  • Se usa cuando está listo para aceptar correcciones de errores en su dependencia, pero no desea ningún cambio potencialmente incompatible.
  • La tilde coincide con la versión menor más reciente (el número del medio).
  • ~ 1.2.3 coincidirá con todas las versiones 1.2.x, pero se perderá 1.3.0.
  • Tilde (~) te ofrece versiones de corrección de errores

^ Caret:

  • ^ arregla solo el número principal.
  • Se usa cuando está observando de cerca sus dependencias y está listo para cambiar rápidamente su código si la versión menor será incompatible.
  • Te actualizará a la versión principal más reciente (el primer número).
  • ^ 1.2.3 coincidirá con cualquier versión 1.xx incluyendo 1.3.0, pero se mantendrá en 2.0.0.
  • Caret (^) también te ofrece una nueva funcionalidad compatible con versiones anteriores.



~ : Razonablemente cerca de

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^ : Compatible con

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0



~ arregla números mayores y menores. Se usa cuando está listo para aceptar correcciones de errores en su dependencia, pero no desea ningún cambio potencialmente incompatible.

^ arregla solo el número principal. Se usa cuando está observando de cerca sus dependencias y está listo para cambiar rápidamente su código si la versión menor será incompatible.

Además de eso, ^ no es compatible con las versiones antiguas de npm, y debe usarse con precaución.

Entonces, ^ es un buen valor predeterminado, pero no es perfecto. Sugiero que elijas y configures cuidadosamente el operador de servidor que te sea más útil.




La coincidencia de sombrero se puede considerar "quebrada" porque no actualizará ^0.1.2 a 0.2.0 . Cuando el software está apareciendo, use 0.xy versiones 0.xy coincidencia de sombreros solo coincidirá con el último dígito variable ( y ). Esto se hace a propósito. La razón es que mientras el software está evolucionando, la API cambia rápidamente: un día tienes estos métodos y el otro día tienes esos métodos y los anteriores se han ido. Si no desea romper el código para las personas que ya están usando su biblioteca, vaya e incremente la versión principal: por ejemplo, 1.0.0 -> 2.0.0 -> 3.0.0 . Entonces, para cuando su software finalmente esté 100% hecho y con todas las funciones será como la versión 11.0.0 y no parece muy significativo, y realmente se ve confuso. Si estuvieras, por otro lado, usando 0.1.x -> 0.2.x -> 0.3.x , entonces cuando el software finalmente esté 100% listo y con todas las funciones se lanzará como la versión 1.0.0 y significa "Esta versión es una de servicio a largo plazo, puede continuar y usar esta versión de la biblioteca en su código de producción, y el autor no cambiará todo mañana o el mes próximo y no abandonará el paquete".

La regla es: use versiones de 0.xy cuando su software aún no ha madurado y 0.xy incrementando el dígito medio cuando su API pública cambie (por lo tanto, las personas que tengan ^0.1.0 no obtendrán 0.2.0 actualización de 0.2.0 y 0.2.0 ' romper su código). Luego, cuando el software madure, libérelo por debajo de 1.0.0 e incremente el dígito más a la izquierda cada vez que su API pública cambie (por lo tanto, las personas que tengan ^1.0.0 no obtendrán la actualización 2.0.0 y no romperán su código).

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.