Después de actualizar al último node estable y npm , probé npm install moment --save . Guarda la entrada en el package.json con el prefijo de intercalación ^ . Anteriormente, era un prefijo de tilde ~ .
npm ?~ y caret ^ ?^ es 1.[cualquiera].[cualquiera] (última versión secundaria)
~ es 1.2.[cualquiera] (último parche)
Una gran lectura es esta publicación de blog sobre cómo semver se aplica a npm
y lo que están haciendo para que coincida con el estándar semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
También me gustaría agregar la documentación oficial de npmjs que describe todos los métodos para la especificidad de la versión, incluidos los mencionados en la pregunta.
| valor | descripción |
|---|---|
~version | "Aproximadamente equivalente a la versión" Ver npm semver - Rangos Tilde |
^version | "Compatible con la versión" Ver npm semver - Intervalos de intercalación |
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 |
* | Coincide con cualquier versión |
latest | Obtiene la última versión |
La lista de arriba no es exhaustiva. Otros especificadores de versión incluyen URL de GitHub y repositorios de usuarios de GitHub, rutas locales y paquetes con etiquetas npm específicas
~ : 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.0npm permite instalar una versión más nueva de un paquete que la especificada. El uso de tilde ( ~ ) le brinda versiones de corrección de errores y el signo de intercalación ( ^ ) también le brinda una nueva funcionalidad compatible con versiones anteriores.
El problema es que las versiones antiguas generalmente no reciben tantas correcciones de errores, por lo que npm usa el signo de intercalación ( ^ ) como valor predeterminado para --save .
De acuerdo con: "Semver explicó: ¿por qué hay un signo 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 el control de versiones semántico. Para las versiones 0.xx, el signo de intercalación solo permite actualizaciones de parches , es decir, se comporta igual que la tilde. Consulte "Rangos de intercalación"
Aquí hay una explicación visual de los conceptos:
Fuente: "Hoja de trucos de control de versiones semánticas" .
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.21.2.3 .^ (como cabeza). Permite actualizaciones en el segundo nivel distinto de cero desde la izquierda: ^0.2.3 significa 0.2.3 <= v < 0.3 .~ (como la cola). Generalmente congela el nivel más a la derecha o establece 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 .0.2 significa 0.2 <= v < 1 . Difiere de ~ porque:0Establezca el nivel principal inicial y permita actualizaciones hacia arriba
* or "(empty string) any version 1 v >= 1Congelar nivel principal
~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 < 2Congelar 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.3Congelar 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 : falta mayor, menor, parche o la especificación de beta sin número, es lo mismo que any nivel faltante.
Aviso : ¡Cuando instala un paquete 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 principales/secundarios/de parches.
Consulte los documentos de NPM y los documentos de Semver :
~version "Aproximadamente equivalente a la versión" , lo actualizará a todas las futuras versiones de parches, sin incrementar la versión secundaria. ~1.2.3 utilizará versiones de 1.2.3 a <1.3.0.
^version "Compatible con la versión" , lo actualizará a todas las futuras versiones secundarias/parches, sin incrementar la versión principal. ^2.3.4 utilizará versiones de 2.3.4 a <3.0.0.
Consulte los comentarios a continuación para conocer las excepciones, en particular para las versiones anteriores, como ^ 0.2.3
Siempre que el primer número ("mayor") sea al menos 1:
~ bloquea números mayores y menores. Se usa cuando está listo para aceptar solo correcciones de errores (incrementos en el tercer número), pero no desea ningún otro cambio, ni siquiera actualizaciones menores que agreguen funciones.
^ bloquea solo el número mayor. Se usa cuando está dispuesto a recibir correcciones de errores (incrementos en el tercer número) y actualizaciones menores que agregan funciones pero no deberían romper el código existente (incrementos en el segundo número). Sin embargo, no desea cambios que rompan el código existente (incrementos en el primer número).
Además de eso, ^ no es compatible con versiones anteriores de npm y debe usarse con precaución.
Entonces, ^ es un buen valor predeterminado, pero no es perfecto. Sugiero elegir y configurar cuidadosamente el operador de semver que le resulte más útil.
(Revisado para evitar decir "arreglos" y "correcciones de errores" con el uso conflictivo de "arreglos", lo cual es confuso)
~ tilde:
~ congela números mayores y menores.^ Intercalación:
^ congela solo el número mayor.La combinación de sombreros puede considerarse "rota" porque no actualizará ^0.1.2 a 0.2.0 . Cuando el software esté emergiendo, use versiones 0.xy y la 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 evoluciona, la API cambia rápidamente: un día tienes estos métodos y el otro día tienes esos métodos y los antiguos ya no están. 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 esté finalmente 100% terminado 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, por otro lado, estaba usando 0.1.x -> 0.2.x -> 0.3.x , para cuando el software finalmente esté 100% terminado y con todas las funciones, se lanzará como versión 1.0.0 y significa "Esta versión es un 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 próximo mes, y no abandonará el paquete".
La regla es: use el control de versiones 0.xy cuando su software aún no haya madurado y publíquelo incrementando el dígito medio cuando cambie su API pública (por lo tanto, las personas que tengan ^0.1.0 no obtendrán la actualización 0.2.0 y no romper su código). Luego, cuando el software madure, publíquelo 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 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.Explicación de una línea
El sistema de versiones estándar es major.minor.build (por ejemplo, 2.4.1)
npm verifica y corrige la versión de un paquete en particular en función de estos caracteres
~ : la versión principal está arreglada, la versión secundaria está arreglada, coincide con cualquier número de compilación
por ejemplo: ~2.4.1 significa que buscará 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 buscará 2.xx donde x es cualquier cosa
Probablemente haya visto la tilde (~) y el signo de intercalación (^) en el paquete.json. ¿Cuál es la diferencia entre ellos?
Cuando hace npm install moment --save, guarda la entrada en el paquete.json con el prefijo de intercalación (^).
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 signo de intercalación (^), por otro lado, está más relajado. Lo actualizará a la versión principal más reciente (el primer número). ^ 1.2.3 coincidirá con cualquier versión 1.xx, incluida la 1.3.0, pero pospondrá la 2.0.0.
Referencia: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
Tilde ~ especifica lanzamientos de versiones menores
Caret ^ especifica los lanzamientos de versiones principales
Por ejemplo, si la versión del paquete es 4.5.2 , en la actualización:
~4.5.2 instalará la última 4.5.x version (MINOR VERSION)
^4.5.2 instalará la última 4.xx version (MAJOR VERSION)
tilde (~)
la versión principal está arreglada, la versión secundaria está arreglada, coincide con cualquier número de compilación
"express": "~4.13.3" ~4.13.3 significa que buscará 4.13.x donde x es cualquier cosa y 4.14.0
Intercalación (^)
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 buscará 3.xx donde x es cualquier cosa
No es una respuesta per se, sino una observación que parece haber sido pasada por alto.
La descripción de los rangos de intercalación:
ver: https://github.com/npm/node-semver#caret-ranges-123-025-004
Permite cambios que no modifican el dígito distinto de cero más a la izquierda en la tupla [principal, menor, parche].
Significa que ^10.2.3 coincide con 10.2.3 <= v < 20.0.0
No creo que eso sea lo que querían decir. Obtener las versiones 11.xx a 19.xx romperá su código.
Creo que se referían left most non-zero number field . No hay nada en SemVer que requiera que los campos numéricos sean de un solo dígito.
Tilde ~ coincide con la versión menor, si ha instalado un paquete que tiene 1.4.2 y después de su instalación, las versiones 1.4.3 y 1.4.4 también están disponibles si en su paquete.json se usa como ~ 1.4.2 y luego npm install en su proyecto después de la actualización instalará 1.4.4 en su proyecto. Pero hay 1.5.0 disponible para ese paquete, entonces ~ no lo instalará. Se llama versión menor.
Caret ^ coincide con la versión principal, si el paquete 1.4.2 está instalado en su proyecto y después de que se publique la instalación 1.5.0, entonces ^ instalará la versión principal. No permitirá instalar 2.1.0 si tiene ^1.4.2 .
Versión fija si no desea cambiar la versión del paquete en cada instalación, entonces use la versión fija sin ningún carácter especial, por ejemplo, "1.4.2"
Última versión * Si desea instalar la última versión, use solo * delante del nombre del paquete.
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.
mayor.menor.parche 1.0.2
Mayor, menor y parche representan las diferentes versiones de un paquete.
npm usa la tilde (~) y el signo de intercalación (^) para designar qué parche y versiones secundarias usar respectivamente.
Entonces, si ve ~ 1.0.2, significa que debe instalar la versión 1.0.2 o la última versión del parche, como 1.0.4. Si ve ^ 1.0.2, significa que debe instalar la versión 1.0.2 o la última versión secundaria o parche, como 1.1.0.
intercalación ^ incluye todo lo que sea mayor que una versión particular en el mismo rango principal.
tilde ~ incluye todo lo que sea mayor que una versión particular en el mismo rango menor.
Por ejemplo, para especificar rangos de versiones aceptables hasta 1.0.4, use la siguiente sintaxis:
Para obtener más información sobre la sintaxis de versiones semánticas, consulte la calculadora de npm semver .
Más de la documentación de npm Acerca de las versiones semánticas
semver está separado en 3 secciones principales que están divididas por puntos.
major.minor.patch 1.0.0Estos diferentes principales, secundarios y parches se utilizan para identificar diferentes versiones. tide (~) y signo de intercalación (^) se utilizan para identificar qué versión secundaria y de parche se utilizará en el control de versiones del paquete.
~1.0.1 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5 ^1.0.1 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1En relación con esta pregunta, puede revisar la documentación de Composer en las versiones , pero aquí en resumen:
Por lo tanto, con Tilde obtendrá actualizaciones automáticas de parches, pero las versiones menores y mayores no se actualizarán. Sin embargo, si usa Caret obtendrá parches y versiones secundarias, pero no obtendrá versiones principales (cambios importantes).
La versión Tilde se considera un enfoque "más seguro", pero si está utilizando dependencias confiables (bibliotecas bien mantenidas) no debería tener ningún problema con la versión Caret (porque los cambios menores no deberían ser cambios importantes).
Probablemente debería revisar esta publicación de stackoverflow sobre las diferencias entre la instalación y la actualización del compositor .