¿Cuál es la diferencia entre ~> y> = al especificar rubygem en Gemfile?

120

A menudo veo la siguiente notación (~>) en Gemfile.

gem "cucumber", "~>0.8.5"
gem "rspec", "~>1.3.0"

Sé que el signo (> =) es mayor o igual a, pero ¿qué significa la notación (~>)? ¿Ambos son iguales o tienen alguna diferencia significativa?

Autodidacta
fuente
6
Consulte también: Significado de ~>requisito en versión .
Jörg W Mittag
28
~>a veces se le llama "operador de esperma".
Andrew Grimm
3
¿Puede especificar un rango para la versión de Ruby en su Gemfile? Por ejemploruby "~>2.0"
Dennis
1
o llamado twiddle-wakka
SuckerForMayhem
@Dennis aquí hay una respuesta a su pregunta: stackoverflow.com/a/23116552/6359753
Henry Yang

Respuestas:

165

Esa es una restricción de versión pesimista . RubyGems incrementará el último dígito en la versión proporcionada y lo usará hasta que alcance una versión máxima. Entonces ~>0.8.5es semánticamente equivalente a:

gem "cucumber", ">=0.8.5", "<0.9.0"

La forma más fácil de pensarlo es que está de acuerdo con que el último dígito se incremente a algún valor arbitrario, pero los que lo preceden en la cadena no pueden ser mayores que lo que proporcionó. Por lo tanto ~>0.8.5, para , cualquier valor es aceptable para el tercer dígito (el 5) siempre que sea mayor o igual a 5, pero el 0,8 inicial debe ser "0,8".

Puede hacer esto, por ejemplo, si cree que la versión 0.9 va a implementar algunos cambios importantes, pero sabe que toda la serie de versiones 0.8.x son solo correcciones de errores.

Sin embargo, el simple uso ">=0.8.5"indicaría que cualquier versión posterior (o igual a) 0.8.5 es aceptable. No hay límite superior.

eldarerathis
fuente
¿Cómo se comporta esto con las gemas que usan cuatro dígitos para sus versiones, como backbone-on-rails ?
JJD
2
@JJD: Debería ser básicamente el mismo comportamiento. El último dígito de los cuatro se puede incrementar sin límite, pero el tercero no (por ~>0.9.2.3lo que permitiría v0.9.2.4 o v0.9.2.23 pero no v0.9.3.0). Si solo especificó 3 dígitos en la restricción, entonces el cuarto sería esencialmente irrelevante; solo estaría restringido en función de los primeros tres que especifique (por ejemplo ~>0.9.2, aceptaría cualquier cosa dentro de una serie 0.9.xy, independientemente de lo que ysea; la restricción es que el 9 no se puede incrementar).
eldarerathis
3
Sin embargo, hay una excepción a la regla de que "RubyGems incrementará el último dígito de la versión": cuando proporcione un dígito. Puede esperar que "~> 4" signifique "Cualquier versión 4 o superior", pero no es así, así que tenga cuidado.
hlascelles
2
¿Qué pasa con ~> 0.1 frente a ~> 0.1.0? Si pensamos en ello como "está de acuerdo con que el último dígito se incremente a un valor arbitrario", ~> 0.1 se traduce en> = 0.1.0 <1.0.0 mientras que ~> 0.1.0 se traduce en> = 0.1.0 < 0.2.0. ¿Es eso correcto?
Wei
Cuando veo un proyecto de GitHub que dice que requiere ruby> = 2.4.4, ¿puedo asumir que son compatibles con todos los ruby ​​después de 2.4.4, incluidos 2.5.1 e incluso ruby ​​3? ¿O deberíamos jugar de forma segura (es decir, en lugar de pensar que admitirán todos los ruby ​​después de 2.4.4 inclusive, debería pensar que quieren decir que no admitirán ningún ruby ​​antes de 2.4.4)?
Henry Yang
3

@millisami Incluso puede usar para agregar dependencias con gemspec usando la restricción pesimista como esta:

gem.add_runtime_dependency "thor", "~> 0.18.1"

Si no sabe mucho sobre el desarrollo de gemas o simplemente se está iniciando en él, estas son algunas buenas referencias:

  1. Tutorial que le enseña cómo crear su propio RubyGem, las prácticas estándar asociadas con él y cómo cargarlo para que otros puedan instalarlo.
  2. Cómo crear una gema desde cero con Bundler
bucles extraños
fuente
1
El primer enlace es un 404
Petr Gazarov