Después de actualizar a la última versión estable node
e npm
intenténpm install moment --save
. Guarda la entrada en el package.json
con el ^
prefijo caret . Anteriormente, era un ~
prefijo tilde .
- ¿Por qué se realizan estos cambios
npm
? - ¿Cuál es la diferencia entre tilde?
~
y caret^
? - ¿Cuáles son las ventajas sobre los demás?
node.js
npm
package.json
semantic-versioning
Fizer Khan
fuente
fuente
npm config set save-prefix=''
. (Pegue~
las comillas si eso es lo que prefiere). Yo personalmente hago esto y reduzco las cosas en producción.Respuestas:
Vea los documentos NPM y los documentos semver :
~ versión "Aproximadamente equivalente a la versión", lo actualizará a todas las futuras versiones de parche, sin incrementar la versión menor.
~1.2.3
utilizará versiones de 1.2.3 a <1.3.0.^ versión "Compatible con la versión", lo actualizará a todas las futuras versiones menores / 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 ver las excepciones, en particular para las versiones anteriores, como ^ 0.2.3
fuente
^
o a~
. Establezca esto si desea tener un control estricto sobre sus versiones:npm config set save-prefix=''
0.2.x
,2
no es unmajor version
. Es por eso que docs.npmjs.com utilizan las palabras específicas:the left-most non-zero digit
. También qué pasa con este caso: ^ 0.0.4 significa 0.0.4A
en 3 versiones:0.0.1
,0.0.2
y0.0.3
. Hay un error, por0.0.1
lo que desea tener al menos0.0.2
en su paqueteB
. Si escribes0.0.x
obtendrás0.0.3
, lo cual está bien. Pero si algún otro paqueteC
requiere ambosB
yA
además tiene restricciones"A": "<0.0.2"
, obtendrá0.0.1
sin mostrar ningún problema de conflicto, que no es lo que desea. Usar tilde~0.0.2
debería ayudarlo a evitar este problema.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 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" Ver 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.0http://sometarballurl
(esta puede ser la URL de un tarball que se descargará e instalará localmente*
Coincide con cualquier versiónlatest
Obtiene la última versiónLa lista de arriba no es exhaustiva. Otros especificadores de versión incluyen URL de GitHub y repositorios de usuario de GitHub, rutas locales y paquetes con etiquetas npm específicas
fuente
1.2.0 || >=1.2.2 <1.3.0
: Exactamente 1.2.0, o todo, desde 1.2.2 a 1.3.0 (inclusive), pero no 1.2.1, o 1.3.1 y superior, y tampoco 1.1 .x y abajo."Approximately equivalent to version"
y"Compatible with version"
son formas frustrantemente inespecíficas de describir el comportamiento ~ y ^. ¡Gracias @jgillich por proporcionar una respuesta real!npm 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 caret (^
) también le brinda una nueva funcionalidad compatible con versiones anteriores.El problema es que las versiones antiguas generalmente no reciben muchas correcciones de errores, por lo que npm usa caret (
^
) como predeterminado--save
.Según: "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 1.0.0 y no todos los proyectos siguen versiones semánticas. Para las versiones 0.xx, el cursor solo permite actualizaciones de parches , es decir, se comporta igual que la tilde. Ver "Gamas de Caret"
Aquí hay una explicación visual de los conceptos:
Fuente: "Hoja de referencia de versiones semánticas" .
fuente
Semver
Permitir o rechazar cambios
1.2.3
.^
(como la cabeza). Permite actualizaciones en el segundo nivel distinto de cero desde la izquierda:^0.2.3
significa0.2.3 <= v < 0.3
.~
(como la cola). Generalmente congela el nivel más a la derecha o establece cero si se omite:~1
medio1.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
.0.2
medios0.2 <= v < 1
. Difiere de~
porque:0
Todas (con suerte) posibilidades
Establezca el inicio a nivel principal y permita actualizaciones hacia arriba
Congelar a nivel mayor
Congelar a nivel menor
Nivel de parche congelado
No permitir actualizaciones
Aviso : Falta mayor, menor, parche o especificación
beta
sin número, es lo mismo queany
para el nivel faltante.Aviso : cuando instala un paquete que tiene
0
un nivel principal, la actualización solo instalará una nueva versión de nivel beta / pr. Esto se debe a que senpm
establece^
como predeterminado enpackage.json
y cuando la versión instalada es similar0.1.3
, congela todos los niveles principales / menores / parches.fuente
~
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.^
solo arregla el número mayor. Se usa cuando observa de cerca sus dependencias y está listo para cambiar rápidamente su código si una versión menor es incompatible.Además de eso,
^
es no compatible con las versiones antiguas de npm y debe usarse con precaución.Entonces,
^
es un buen defecto, pero no es perfecto. Sugiero elegir cuidadosamente y configurar el operador de semver que sea más útil para usted.fuente
~
: Razonablemente cerca de^
: Compatible confuente
^0.1.3
solo acepta versiones0.1.x
y no aceptará0.2.0
, aunque sea un incremento menor. Este comportamiento es equivalente a~0.1.3
. El razonamiento detrás de este comportamiento se debe al hecho de que los paquetes de liberación zeroth todavía se consideran inestables; en palabras de semver.org , # 4, "cualquier cosa puede cambiar en cualquier momento" (incluidos los cambios incompatibles con versiones anteriores).^
es 1. [cualquiera]. [cualquiera] (última versión menor)~
es 1.2. [cualquiera] (último parche)Una buena lectura es esta publicación de blog sobre cómo se aplica semver a npm
y qué están haciendo para que coincida con el estándar de semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
fuente
La coincidencia de sombreros puede considerarse "rota" porque no se actualizará
^0.1.2
a0.2.0
. Cuando el software está surgiendo, use0.x.y
versiones 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 viejos se han ido. Si no desea descifrar el código para las personas que ya están utilizando 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% listo y con todas las funciones, será como una versión11.0.0
y eso no parece muy significativo, y en realidad parece confuso. Si, por otro lado, estuvieras usando ->0.1.x
->0.2.x
0.3.x
versiones de la , y cuando el software esté finalmente 100% listo y con todas las funciones, se lanzará como versión1.0.0
lance y significa "Esta versión es 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 próximo mes, y no abandonará el paquete ".La regla es: use el
0.x.y
control de versiones cuando su software aún no haya madurado y suéltelo incrementando el dígito del medio cuando cambie su API pública (por lo tanto, las personas que^0.1.0
no tengan0.2.0
actualización no romperán su código). Luego, cuando el software madure, suéltelo1.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^1.0.0
no obtengan2.0.0
actualizaciones y no romperán su código)fuente
~ Tilde:
~
congela números mayores y menores.^ Caret:
^
congela solo el número principal.fuente
Tilde ~ coincide con una 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 package.json se usa como ~ 1.4.2 y luego npm install en su proyecto después de la actualización se 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 lanza su 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, luego 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, utilice solo * delante del nombre del paquete.
fuente
Una explicación de 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 basado en estos caracteres
por ejemplo: ~ 2.4.1 significa que verificará 2.4.x donde x es cualquier cosa
por ejemplo: ^ 2.4.1 significa que verificará 2.xx donde x es cualquier cosa
fuente
Probablemente haya visto tilde (~) y caret (^) en el paquete.json. ¿Cuál es la diferencia entre ellos?
Cuando haces npm install moment --save, 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 perderá 1.3.0.
El caret (^)
El caret (^), por otro lado, está 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 retrasará en 2.0.0.
Referencia: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
fuente
semver está separado en 3 secciones principales que se divide por puntos.
Estos diferentes principales, menores y parches se utilizan para identificar diferentes versiones. tide (~) y caret (^) se utilizan para identificar qué versión menor y parche se utilizará en el control de versiones de paquetes.
fuente
Tilde (~)
~4.13.3
significa que verificará 4.13.x donde x es cualquier cosa y 4.14.0Caret (^)
^3.0.0
significa que verificará 3.xx donde x es cualquier cosafuente
El número de versión está en 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 tilde (~) y 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.
fuente
quilates
^
incluyen todo lo que es mayor que una versión particular en el mismo rango principal.tilde
~
incluye todo lo que es 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 sempm de npm .
Más de la documentación de npm Acerca del control de versiones semántico
fuente
No es una respuesta, per se, sino una observación que parece haberse pasado por alto.
La descripción de los rangos de quilates:
ver: https://github.com/npm/node-semver#caret-ranges-123-025-004
Significa que
^10.2.3
coinciden10.2.3 <= v < 20.0.0
No creo que eso sea lo que querían decir. Al introducir las versiones 11.xx a 19.xx, se romperá el código.
Creo que querían decir
left most non-zero number field
. No hay nada en SemVer que requiera que los campos numéricos sean de un solo dígito.fuente
~ especificaciones para lanzamientos de versiones menores ^ especifica para lanzamientos de versiones principales
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 instalará la última versión 4.xx (VERSIÓN MAYOR)
fuente
En relación con esta pregunta, puede revisar la documentación de Composer sobre 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 usas Caret obtendrá parches y versiones menores, 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 .
fuente