Significado de tilde-greater-than (~>) en el requisito de versión?

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

 hanna-0.1.12 depende de [haml (~> 2.2.8)]

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

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

  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.x o 3.5.6.x coinciden, pero 0.x o 3.5.7.x no) 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, 3.5.6.2 y 3.5.6.2 coinciden, pero 1.2 o 3.5.6.1 no).

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 para ello, es que cuando dices > xyz , estás siendo optimista: supones que de aquí en adelante, hasta la eternidad, la API nunca lo hará cambio. Esto es, por supuesto, 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 rompen la compatibilidad hacia atrás. Usted puede codificar esas reglas de numeración de versiones usando una restricción pesimista, y así puede estar seguro de que su código siempre continuará funcionando (suponiendo que el autor del otro proyecto realmente se adhiere a sus propias reglas, lo que lamentablemente no siempre es el caso )

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

Por ejemplo “~> 1.2” actualizará tu joya a 1.3 (si se lanza una versión de este tipo) pero no la actualizará a 2.0

Creo que el bundler es el que mejor resume esto:

El especificador ~> tiene un significado especial, que se muestra mejor con el 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.

Coincide con cualquier versión que tenga la misma parte mayor / menor. Esto significa que en este caso 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 la API en una nueva gem no da como resultado depender de la gem recién cambiada que en este caso rompería a Hanna.