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


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?

Answers



En los términos más simples, 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 perderá 1.3.0.

El caret, por otro lado, es más relajado. 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.

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/




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




Npm permite instalar versiones más nuevas de un paquete que el especificado. El uso de tilde (~) te brinda versiones de corrección de errores y caret (^) también te ofrece nuevas funciones compatibles con versiones anteriores.

El problema es que las versiones antiguas generalmente no reciben correcciones de errores, por lo que npm usa caret (^) como valor predeterminado para --save .

De acuerdo con: "Semver explicó: ¿por qué hay un símbolo de intercalación (^) en mi paquete. Json?" .

Tenga en cuenta que las reglas se aplican a las versiones anteriores a la 1.0.0 y no todos los proyectos siguen las versiones semánticas.

Aquí hay una explicación visual de los conceptos:

Fuente: "Cheatsheet de versión semántica" .




~ 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.




Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Use la calculadora npm semver para probar. (Aunque las explicaciones para ^ (incluyen todo mayor que una versión particular en el mismo rango mayor) y ~ (incluyen todo mayor que una versión particular en el mismo rango menor) no son 100% correctas, la calculadora parece funcionar bien )
  • Alternativamente, use SemVer Check en su lugar, que no requiere que elija un paquete y también ofrece explicaciones.

Permitir o no permitir cambios

  • Versión del Pin: 1.2.3 .
  • Use ^ (como la cabeza). Permite actualizaciones en el segundo nivel distinto de cero desde la izquierda: ^0.2.3 significa 0.2.3 <= v < 0.3 .
  • Use ~ (como la cola). Generalmente se congela en el nivel más a la derecha o se establece en cero si se omite:
    • ~1 significa 1.0.0 <= v < 2.0.0
    • ~1.2 significa 1.2.0 <= v < 1.3.0 .
    • ~1.2.4 significa 1.2.4 <= v < 1.3.0 .
  • Ommitir el nivel más a la derecha: 0.2 significa 0.2 <= v < 1 . Difiere de ~ porque:
    • El inicio de la versión de nivel omitido siempre es 0
    • Puede establecer la versión principal inicial sin especificar subniveles.

Todas las (con suerte) posibilidades

Establecer el nivel principal de inicio y permitir actualizaciones hacia arriba

*  or "" (empty string)   any version
1                         v >= 1

Congelar mayor nivel

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

Congelar nivel menor

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

Congelar nivel de parche

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

No permitir actualizaciones

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Aviso : la falta de mayor, menor, parche o especificación de beta sin número, es la misma que para el nivel faltante.

Aviso : ¡Cuando instale el pakckage que tiene 0 como nivel principal, la actualización solo instalará una nueva versión de nivel beta / pr! Esto se debe a que npm establece ^ como predeterminado en package.json y cuando la versión instalada es como 0.1.3 , congela todos los niveles mayores / menores / parches.




~ : 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






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.



Una explicación del trazador de líneas

El sistema de control de versiones estándar es major.minor.build (por ejemplo, 2.4.1)

npm revisa y corrige la versión de un paquete particular basado en estos caracteres

~ : la versión principal es fija, la versión menor es fija, coincide con cualquier número de compilación

ej .: ~ 2.4.1 significa que buscará 2.4.x donde x es algo

^ : la versión principal es fija, coincide con cualquier versión menor, coincide con cualquier número de compilación

ej .: ^ 2.4.1 significa que comprobará 2.xx donde x es algo




~ 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.