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


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

  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?

2242
2018-03-12 06:02


origen


Respuestas:


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 lo hará   señorita 1.3.0.

El caret, por otro lado, es más relajado. Te actualizará   la versión principal más reciente (el primer número). ^ 1.2.3 coincidirá   cualquier versión 1.x.x. incluyendo 1.3.0, pero se mantendrá en 2.0.0.

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


2626
2018-03-12 08:28



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://docs.npmjs.com/files/package.json

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

  • ~version "Aproximadamente equivalente a la versión" Ver npm semver - Tilde Ranges & Sever (7)
  • ^version "Compatible con la versión" Ver npm semver - Caret Ranges & Sever (7)
  • version Debe coincidir exactamente 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 (esta puede ser la URL de un tarball que se descargará e instalará localmente)
  • * Coincide con cualquier versión
  • latest Obtiene la última versión

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


568
2017-09-16 06:25



Npm permite instalar versiones más nuevas de un paquete que el especificado. Usando tilde (~) le da versiones de corrección de errores y caret (^) también le ofrece una nueva funcionalidad compatible con versiones anteriores.

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

semver table

De acuerdo a: "Explicó Semver, ¿por qué hay un símbolo (^) en mi paquete. Json?".

Nota que las reglas se aplican a las versiones anteriores a la 1.0.0 y no todos los proyectos siguen las versiones semánticas. Para las versiones 0.x.x, el cursor solo permite parche actualizaciones, es decir, se comporta igual que la tilde. Ver "Caret Ranges"

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

semver diagram

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


346
2017-07-30 20:40



~ 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, ^ es No soportado por versiones viejas de npm, y debe usarse con precaución.

Asi que, ^ 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.


74
2018-03-12 23:05



Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Utilizar calculadora npm semver para las pruebas. (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 Cheque SemVer en cambio, que no requiere que elijas un paquete y también ofrece explicaciones.

Permitir o no permitir cambios

  • Versión del Pin: 1.2.3.
  • Utilizar ^ (como la cabeza). Permite actualizaciones en el segundo nivel distinto de cero desde la izquierda: ^0.2.3 medio 0.2.3 <= v < 0.3.
  • Utilizar ~ (como la cola). Generalmente se congela en el nivel más a la derecha o se establece en cero si se omite:
    • ~1 medio 1.0.0 <= v < 2.0.0
    • ~1.2 medio 1.2.0 <= v < 1.3.0.
    • ~1.2.4 medio 1.2.4 <= v < 1.3.0.
  • Ommitir el nivel más adecuado: 0.2 medio 0.2 <= v < 1. Difiere de ~ porque:
    • Comenzar la versión de nivel omitido es siempre 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

darse cuenta: Falta mayor, menor, parche o especificar beta sin número, es lo mismo que any para el nivel faltante

darse cuenta: Cuando instala un paquete que tiene 0 como nivel principal, ¡la actualización solo instalará una nueva versión de nivel beta / pr! Eso es porque npm conjuntos ^ como predeterminado en package.json y cuando la versión instalada es como 0.1.3, congela todos los niveles mayor / menor / parche.


66
2017-10-11 16:52



~ : Razonablemente cerca a

   ~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

42
2018-06-27 16:12



La coincidencia de sombreros puede considerarse "rota" porque no se actualizará ^0.1.2 a 0.2.0. Cuando el software está saliendo de uso 0.x.y las versiones y la coincidencia de sombreros solo coincidirán 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 viejos se han ido. Si no desea descifrar el código para las personas que ya están usando su biblioteca, vaya e incremente la versión principal: p. 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 eso no parece muy significativo, y en realidad parece confuso. Si fueras, por otro lado, usando 0.1.x -> 0.2.x -> 0.3.x versiones entonces cuando el software finalmente está 100% hecho y con todas las funciones se lanza como 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á la paquete".

La regla es: uso 0.x.y versionar cuando su software aún no ha madurado y liberarlo incrementando el dígito medio cuando su API pública cambia (por lo tanto las personas tienen ^0.1.0 no conseguirá 0.2.0 actualizar y no romperá su código). Luego, cuando el software madure, libérelo bajo 1.0.0 e incrementar el dígito más a la izquierda cada vez que cambia su API pública (por lo tanto, las personas tienen ^1.0.0 no conseguirá 2.0.0 actualizar y no romperá 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.

21
2017-10-19 11:24



^ es 1. [cualquier]. [cualquiera] (última versión menor)
~ es 1.2. [cualquiera] (último parche)

Una gran lectura es esta publicación en el blog sobre cómo se aplica semente a npm
y lo que están haciendo para que coincida el estandarte estándar
http://blog.npmjs.org/post/98131109725/npm-2-0-0


20
2017-12-15 18:07



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

p.ej. : ~ 2.4.1 significa que comprobará 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

p.ej. : ^ 2.4.1 significa que buscará 2.x.x donde x es algo


8
2018-01-21 08:00



~ Tilde:

  • ~ correcciones números mayores y menores.
  • Se usa cuando estás listo para aceptar correcciones de errores en tu dependencia, pero no quiero ningún cambio potencialmente incompatible.
  • La tilde coincide con el 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.x.x incluyendo 1.3.0, pero se mantendrá en 2.0.0.
  • Caret (^) también te ofrece una nueva funcionalidad compatible con versiones anteriores.

3
2017-09-30 10:56



Tilde (~)

la versión principal es arreglada, la versión menor es arreglada, coincide con cualquier compilación   número

"express": "~4.13.3" 

~4.13.3 significa que buscará 4.13.x donde x es cualquier cosa y 4.14.0

Caret (^) 

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

"supertest": "^3.0.0"

^3.0.0 significa que comprobará si hay 3.x.x donde x es algo


2
2018-03-09 12:21