¿Significado de tilde-mayor-que (~>) en el requisito de versión?

92

¿Cuál es el significado del ~>requisito de versión en las especificaciones de gemas?

hanna-0.1.12 depende de [haml (~> 2.2.8)]
Alexey Chernikov
fuente
27
A veces se le llama operador de esperma.
Andrew Grimm
4
o twiddle-wakka
SuckerForMayhem
3
+1 @SuckerForMayhem, "twiddle-wakka" es más divertido. Nuevo enlace: guides.rubygems.org/patterns/#pessimistic-version-constraint - que a su vez enlaza con robots.thoughtbot.com/rubys-pessimistic-operator
The Red Pea
2
@SuckerForMayhem Twiddle-wakka suena como una especie de bestia legendaria como el chupacabras. Esta ha sido mi contribución al tema. De nada, sociedad.
twiz
1
gracias por los enlaces actualizados @TheRedPea
SuckerForMayhem

Respuestas:

93

El manual de RubyGems llama a esto una restricción de versión pesimista .

Suponga que ha especificado un número de versión de n partes, por ejemplo, 1.3(2 partes) o 3.5.6.2(4 partes) como restricción. Luego, para cumplir con la restricción, un número de versión debe satisfacer las dos condiciones siguientes

  1. Las primeras n-1 partes del número de versión deben ser idénticas a las primeras n-1 partes de la restricción (por ejemplo, 1.xo 3.5.6.xcoincidir, pero 0.xo 3.5.7.xno) y

  2. La última parte del número de versión debe ser mayor o igual que la última parte de la restricción (por ejemplo, 1.9999y 3.5.6.2coincide, pero 1.2o 3.5.6.1no).

En otras palabras

~> x 1 .x 2 .x 3 . … .X n-2 .x n-1 .x n

partidos

x 1 .x 2 .x 3 . … .X n-2 .x n-1 .y, y> = x n

La razón por la que esto se llama una restricción "pesimista", y también el caso de uso, es que cuando solo dice > x.y.z, está siendo optimista: asume que de aquí en adelante, hasta la eternidad, la API nunca cambiará. Por supuesto, esta es una suposición bastante audaz. Sin embargo, la mayoría de los proyectos tienen reglas sobre cuándo se les permite romper la compatibilidad hacia atrás , y cómo tienen que cambiar su número de versión cuando se hacen compatibilidad con versiones anteriores de quiebre. Puede codificar esas reglas de numeración de versiones utilizando una restricción pesimista y, por lo tanto, puede estar seguro de que su código siempre seguirá funcionando (suponiendo que el autor del otro proyecto realmente se adhiera a sus propias reglas, lo que desafortunadamente no siempre es el caso ).

Jörg W Mittag
fuente
32
En otras palabras: ~> significa que solo permitirá esa versión específica y sub-versiones más nuevas en el último decimal.
Magne
18

En otras palabras, puede usar este símbolo para mantener su gema actualizada con todas las actualizaciones menores y evitar hacer una actualización importante que pueda romper su aplicación.

Por ejemplo, "~> 1.2" actualizará su gema a 1.3 (si se lanza dicha versión) pero no la actualizará a 2.0

Redjam
fuente
13

Creo que los documentos del paquete resumen mejor esto:

El especificador ~> tiene un significado especial, que se muestra mejor con un ejemplo. ~> 2.0.3 es idéntico a> = 2.0.3 y <2.1. ~> 2.1 es idéntico a> = 2.1 y <3.0. ~> 2.2.beta coincidirá con versiones preliminares como 2.2.beta.12.

Ari
fuente
1
Me temo que no. Me alegra que la respuesta aceptada explique esto con más detalle. Esta explicación basada en ejemplos no me ayuda realmente a comprender lo que quiere decir el operador.
tripleee
-1

Coincide con cualquier versión que tenga la misma parte mayor / menor. Esto significa en este caso que haml ~> 2.2.8 coincidirá con cualquier versión 2.2.x.

Esto se puede usar para asegurarse de que un cambio de ruptura de API en una nueva gema no resulte en depender de esa gema recién cambiada que rompería a Hanna en este caso.

Dirkjan Bussink
fuente
7
Esto no es incorrecto, pero está incompleto. Es importante comprender la diferencia entre ~> 2.0y ~> 2.0.0: el primero coincide con 2.0, 2.1, 2.2.7 y todo lo demás hasta (pero sin incluir) 3.0. Este último coincide con 2.0, 2.0.1, 2.0.999 y todo lo demás hasta (pero sin incluir) 2.1.
James A. Rosen
5
@ James A. Rosen: También, ~> 2.2.8será no relacionar "cualquier 2.2.x" versión como afirma la respuesta, pero sólo 2.2.x versiones con x ≥ 8. OIA: la respuesta es en el mejor de aún más incompleta, cercana a la incorrecta y definitivamente engañoso.
Jörg W Mittag