Bower me permite especificar requisitos de versión para paquetes usando la siguiente sintaxis:
"dependencies": {
"<name>": "<version>",
},
Pero no he podido encontrar cuál es la sintaxis para usar <version>
. Sé que puedo especificar versiones para ser:
- mayor que una cierta versión con
">1.0.0"
- mayor o igual que una versión:
">=1.0.0"
- o en algún rango:
"1.0.0 - 2.0.0"
.
También sé que hay una versión de la sintaxis común que contiene la tilde: "~1.0.0"
. Pero no estoy seguro de lo que significa y si es lo mismo que "=1.0.0"
.
También me interesa saber si puedo especificar varias versiones no consecutivas, como exactamente 1.0.3
más versiones mayores que 1.5.0
, etc.
node.js
bower
semantic-versioning
Samuel Hapak
fuente
fuente
Respuestas:
En pocas palabras, la sintaxis para los números de versión de Bower (y NPM) se llama SemVer, que es la abreviatura de 'Versión Semántica'. Puede encontrar documentación para la sintaxis detallada de SemVer como se usa en Bower y NPM en la API para el analizador semver en Node / npm . Puede obtener más información sobre la especificación subyacente (que no menciona
~
u otros detalles de sintaxis) en semver.org .Hay una calculadora visual semver muy útil con la que puedes jugar, lo que hace que todo esto sea mucho más fácil de asimilar y probar.
¡SemVer no es solo una sintaxis! Tiene algunas cosas bastante interesantes que decir sobre las formas correctas de publicar API, lo que ayudará a comprender qué significa la sintaxis. Crucialmente:
Entonces, su pregunta específica se
~
relaciona con ese esquema Major.Minor.Patch. (Al igual que el operador de intercalación relacionado^
). Puede~
reducir el rango de versiones que está dispuesto a aceptar para:Por ejemplo: para indicar que tomará cualquier cambio posterior a nivel de parche en el árbol 1.2.x, comenzando con 1.2.0, pero menor que 1.3.0, puede usar:
Esto también le ofrece los mismos resultados que con la
.x
sintaxis:Pero, puede usar la tilde /
~
sintaxis para ser aún más específico: si solo está dispuesto a aceptar cambios en el nivel de parche que comiencen con 1.2.4 , pero aún menos que 1.3.0, usaría:Moviéndose a la izquierda, hacia la versión principal , si usa ...
... es lo mismo que ...
... y coincide con cualquier cambio menor o de nivel de parche por encima de 1.0.0, y menos de 2.0:
Tenga en cuenta que la última variación anterior: se llama 'rango de intercalación' . El cursor se parece muchísimo a un
>
, por lo que sería excusado por pensar que significa "cualquier versión mayor que 1.0.0". (Ciertamente me he resbalado en eso.) ¡No!Los rangos de atención se utilizan básicamente para decir que solo le importa el dígito más significativo de la izquierda, generalmente la versión principal, y que permitirá cualquier cambio menor o de nivel de parche que no afecte a ese dígito de la izquierda. Sin embargo, a diferencia de un rango de tilde que especifica una versión principal, los rangos de intercalación le permiten especificar un punto de inicio menor / parche preciso. Entonces, mientras
^1.0.0 === ~1
, un rango de intercalación como le^1.2.3
permite decir que tomará cualquier cambio>=1.2.3 && <2.0.0
. No podrías hacer eso con un rango de tilde.Todo eso parece confuso al principio, cuando lo miras de cerca. Pero aleja la imagen por un segundo y piénsalo de esta manera: el cursor simplemente te permite decir que estás más preocupado por cualquier dígito significativo que quede más a la izquierda. La tilde le permite decir que está más preocupado por el dígito más adecuado. El resto es detalle.
Es el poder expresivo de la tilde y el caret lo que explica por qué las personas los usan mucho más que la
.x
sintaxis más simple : simplemente te permiten hacer más. Es por eso que verá que la tilde se usa a menudo, incluso donde.x
serviría. Como ejemplo, vea npm: su propio archivo package.json incluye muchas dependencias en el~2.4.0
formato, en lugar del2.4.x
formato que podría usar. Al apegarse a~
, la sintaxis es consistente en toda una lista de más de 70 dependencias versionadas, independientemente de qué número de parche inicial sea aceptable.De todos modos, aún hay más en SemVer, pero no intentaré detallarlo todo aquí. Compruébelo en el archivo léame del paquete semver del nodo . Y asegúrese de usar la calculadora de versiones semánticas mientras practica e intenta entender cómo funciona SemVer.
RE: Números de versión no consecutivos: la pregunta final de OP parece ser sobre la especificación de números / rangos de versión no consecutivos (si lo he editado de manera justa). Sí, se puede hacer eso, utilizando el doble tubería común "o" operador:
||
. Al igual que:fuente
~
en particular, significa que el número del parche (tercero) puede ser mayor que el especificado, por ejemplo,~1.2.3
es equivalente a>=1.2.3 <1.3.0
.'1.1.x' === '>=1.1.0' === '~1.1.0'
. El caso 1.1.0 es fácil. Pero la notación x no puede ser granular, como puede'>=1.1.4'
o'~1.1.4'
. Entonces, terminas'1.1.x'
en un lugar de tu lista de dependencias y'~2.7.3'
en otro lugar. Eso está bien y funciona, pero un desarrollador necesita analizar múltiples sintaxis para leer una sola lista. Y, si está escribiendo paquetes para configurar la versión mediante programación, desea una sintaxis única. Y, la mayoría de la gente quiere evitar cambios importantes. Por lo tanto, todos los problemas resueltos con~
.Basado en semver , puedes usar
Rango de guiones XYZ - ABC
1.2.3-2.3.4
indica > = 1.2.3 <= 2.3.4Rangos X
1.2.x 1.X 1.2.*
Tilde Ranges
~1.2.3 ~1.2
Indica que permite cambios a nivel de parche o cambios menores en la versión.Caret Rangos ^ 1.2.3 ^ 0.2.5 ^ 0.0.4
Permite cambios que no modifican el dígito más a la izquierda que no es cero en la tupla [mayor, menor, parche]
^1.2.x
(significa> = 1.2.0 <2.0.0)^0.0.x
(significa> = 0.0.0 <0.1.0)^0.0
(significa> = 0.0.0 <0.1.0)fuente
Bower usa la sintaxis semver , pero aquí hay algunos ejemplos rápidos:
Puedes instalar una versión específica:
Puede usar ~ para especificar 'cualquier versión que comience con esto':
Puede especificar múltiples requisitos de versión juntos:
fuente
También puede usar la
latest
palabra clave para instalar la versión más reciente disponible:fuente
"*" := >=0.0.0
(Cualquier versión satisface)" que está cerca pero un poco vago ya que no dice específicamente más reciente, por lo que podría ser el primero que encuentre?Si no hay un número de parche,
~
es equivalente a agregar.x
a la versión sin tilde. Si hay un número de parche,~
permite todos los números de parche> = el especificado.No tengo suficientes puntos para comentar sobre la respuesta aceptada, pero parte de la información tilde está reñida con la documentación vinculada semver:
"angular": "~1.2"
se no coincidir con 1.3, 1.4, 1.4.9. Además"angular": "~1"
y no"angular": "~1.0"
son equivalentes. Esto se puede verificar con la calculadora npm semver .fuente