node.js - mac - npm version
¿Cuál es la diferencia entre tilde(~) y caret(^) en package.json? (14)
Después de actualizar a los últimos node
estables y npm
, probé npm install moment --save
. Guarda la entrada en package.json
con el prefijo caret(^)
. Anteriormente, era un prefijo de tilde(~)
.
- ¿Por qué se hacen estos cambios en
npm
? - ¿Cuál es la diferencia entre
tilde(~)
ycaret(^)
? - ¿Cuáles son las ventajas sobre los demás?
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 se perderá 1.3.0.
El caret, por otro lado, es más relajado. Le 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/
Tenga en cuenta que la terminología del autor es algo engañosa: cuando dice "la versión menor más reciente" para ~ significa "la versión de parche más reciente en la versión menor especificada". De manera similar para ^, "la versión principal más reciente" debe leerse como "la versión menor más reciente en la versión principal especificada".
Semver
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
- Utilice la semver.npmjs.com para la prueba. (Aunque las explicaciones para ^ (incluyen todo lo que es mayor que una versión particular en el mismo rango principal) y ~ (incluyen todo lo que es mayor que una versión particular en el mismo rango menor) no son correctas al 100%, 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 rechazar cambios
- Versión pin:
1.2.3
. - Use
^
(como la cabeza). Permite actualizaciones en el segundo nivel distinto de cero desde la izquierda:^0.2.3
significa0.2.3 <= v < 0.3
. - Use
~
(como la cola). Generalmente se congela el nivel más a la derecha o se establece cero si se omite:-
~1
significa1.0.0 <= v < 2.0.0
-
~1.2
significa1.2.0 <= v < 1.3.0
. -
~1.2.4
significa1.2.4 <= v < 1.3.0
.
-
- Omita el nivel más a la derecha:
0.2
significa0.2 <= v < 1
. Difiere de~
porque:- Comenzar la versión de nivel omitida siempre es
0
- Puede establecer la versión principal de inicio sin especificar subniveles.
- Comenzar la versión de nivel omitida siempre es
Todas las posibilidades (con suerte)
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 menor nivel
^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
Nivel de parche congelado
~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 : Falta el parche mayor, el menor, el parche o la especificación del número sin número, es el mismo que para el nivel faltante.
Aviso : Cuando instale un paquete que tiene 0
como nivel principal, la actualización solo instalará la nueva versión beta / pr level. 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 de parches mayores / menores.
El número de versión está en la sintaxis que designa cada sección con un significado diferente. la sintaxis se divide en tres secciones separadas por un punto.
major.minor.patch 1.0.2
Major, minor y patch representan las diferentes versiones de un paquete.
npm usa la tilde (~) y el caret (^) para designar qué parche y versiones menores usar respectivamente.
Entonces, si ve ~ 1.0.2, significa instalar la versión 1.0.2 o la última versión del parche, como 1.0.4. Si ve ^ 1.0.2, significa instalar la versión 1.0.2 o la última versión menor o parche, como 1.1.0.
La coincidencia de sombrero puede considerarse "rota" porque no se actualizará ^0.1.2
a 0.2.0
. Cuando el software esté emergiendo, use 0.xy
versiones 0.xy
y la coincidencia de sombrero solo coincidirá con el último dígito variable ( y
). Esto se hace a propósito. La razón es que mientras el software evoluciona, 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 quiere descifrar 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, cuando el software esté 100% listo y con todas las funciones, será como la versión 11.0.0
y no parece muy significativo, y en realidad parece confuso. Si, por otro lado, 0.3.x
versiones 0.1.x
-> 0.2.x
-> 0.3.x
, entonces, cuando el software finalmente esté 100% terminado y con todas las funciones, se lanza como la versión 1.0.0
y significa "Esta versión es una versión 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 la versión 0.xy
cuando su software aún no haya madurado y 0.xy
incrementando el dígito medio cuando cambie su API pública (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
) t romper su código). Luego, cuando el software madure, 1.0.0
bajo 1.0.0
e incremente el dígito más a la izquierda cada vez que cambie su API pública (por lo tanto, las personas que tienen ^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.
Me gustaría agregar también la documentación oficial de npmjs que describe todos los métodos de especificidad de versión, incluidos los mencionados 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" Consulte npm semver - Tilde Ranges & semver (7) -
^version
"Compatible con la versión" Ver npm semver - Caret Ranges & semver (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 unhttp://sometarballurl
que se descargará e instalará localmente -
*
Coincide con cualquier versión -
latest
obtiene último lanzamiento
La lista de arriba no es exhaustiva. Otros especificadores de versión incluyen urls de GitHub y repo de usuario de GitHub, rutas locales y paquetes con etiquetas npm específicas
Npm permite instalar una versión más nueva de un paquete que la especificada. El uso de tilde ( ~
) le brinda correcciones de errores y caret ( ^
) también le brinda una nueva funcionalidad compatible hacia atrás.
El problema es que las versiones anteriores generalmente no reciben tantas correcciones de errores, por lo que npm usa caret ( ^
) como predeterminado para --save
.
Según: "Semver explicó: ¿por qué hay un caret (^) en mi package.json?" .
Tenga en cuenta que las reglas se aplican a las versiones superiores a 1.0.0 y no todos los proyectos siguen las versiones semánticas. Para las versiones 0.xx, el caret solo permite actualizaciones de parches , es decir, se comporta igual que la tilde. Ver "Caret Ranges"
Aquí hay una explicación visual de los conceptos:
Fuente: "Cheatsheet de versión semántica" .
Probablemente has visto la tilde (~) y el caret (^) en el package.json. ¿Cuál es la diferencia entre ellos?
Cuando haga npm install moment --save, se guarda la entrada en package.json con el prefijo caret (^).
La tilde (~)
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 se perderá 1.3.0.
El caret (^)
El caret (^), por otro lado, es más relajado. Le 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.
Referencia: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
~ specfices a versiones menores de versión ^ especifica a versiones principales de versión
Por ejemplo, si la versión del paquete es 4.5.2, en la Actualización ~ 4.5.2 se instalará la última versión 4.5.x (VERSIÓN MENOR) ^ 4.5.2 se instalará la última versión 4.xx (VERSIÓN MAYOR)
^
es 1. [cualquiera]. [cualquiera] (última versión secundaria)
~
es 1.2. [any] (último parche)
Una buena lectura es esta publicación del blog sobre cómo semver se aplica a npm
y lo que están haciendo para que coincida con el estándar de semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
~
: 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
~
Corrige 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 el número mayor solamente. Se usa cuando está observando de cerca sus dependencias y está listo para cambiar rápidamente su código si la versión menor es incompatible.
Además de eso, ^
no es compatible con las versiones anteriores de npm, y debe usarse con precaución.
Entonces, ^
es un buen valor predeterminado, pero no es perfecto. Sugiero que escoja y configure cuidadosamente el operador semver que sea más útil para usted.
Tilde (~)
la versión principal es fija, la versión secundaria es fija, coincide con cualquier número de compilación
"express": "~4.13.3"
~4.13.3
significa que comprobará 4.13.x donde x es cualquier cosa y 4.14.0
Caret (^)
la versión principal es fija, coincide con cualquier versión secundaria, coincide con cualquier número de compilación
"supertest": "^3.0.0"
^3.0.0
significa que comprobará 3.xx donde x es cualquier cosa
Una explicación de línea
El sistema de control de versiones estándar es major.minor.build (por ejemplo, 2.4.1)
npm comprueba y corrige la versión de un paquete en particular basado en estos caracteres
~ : la versión principal es fija, la versión secundaria es fija, coincide con cualquier número de compilación
por ejemplo: ~ 2.4.1 significa que comprobará 2.4.x donde x es cualquier cosa
^ : la versión principal es fija, coincide con cualquier versión secundaria, coincide con cualquier número de compilación
por ejemplo: ^ 2.4.1 significa que comprobará 2.xx donde x es cualquier cosa
~ Tilde:
-
~
Corrige 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 perderá 1.3.0.
- Tilde (~) te da versiones de corrección de errores
^ Caret:
-
^
arregla el número mayor solamente. - Se usa cuando está observando de cerca sus dependencias y está listo para cambiar rápidamente su código si la versión menor es incompatible.
- Le 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.