2010-11-27 10 views
101

A menudo veo la siguiente notación (~>) en Gemfile.¿Cuál es la diferencia entre ~> y> = al especificar rubygem en Gemfile?

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

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

+6

Véase también: [Significado de '~>' en el requisito de versión] (http://StackOverflow.Com/q/3414337/#3416289). –

+20

'~>' a veces se denomina "operador de esperma". –

+2

¿Puedes especificar un rango para la versión de Ruby en tu Gemfile? P.ej. 'ruby" ~> 2.0 "' – Dennis

Respuesta

141

Eso es pessimistic version constraint. RubyGems incrementará el último dígito en la versión provista y lo usará hasta que alcance una versión máxima. Así ~>0.8.5 es semánticamente equivalente a:

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

La manera más fácil de pensar en ello es que estás de acuerdo con el último dígito incrementando hasta cierto valor arbitrario, pero los que lo preceden en la cadena no puede ser mayor de lo que proporcionaste Por lo tanto, para ~>0.8.5, cualquier valor es aceptable para el tercer dígito (el 5) siempre que sea mayor o igual a 5, pero el 0,8 líder debe ser "0,8".

Puede hacer esto, por ejemplo, si cree que la versión 0.9 va a implementar algunos cambios bruscos, pero sabe que toda la serie de lanzamientos 0.8.x es solo una corrección de errores.

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

+0

¿Cómo se comporta esto con las gemas que usan cuatro dígitos para su versión como [backbone] -on-rails] (https://github.com/meleyal/backbone-on-rails)? – JJD

+2

@JJD: Debe ser básicamente el mismo comportamiento. El último dígito de los cuatro puede incrementarse sin límite, pero el tercero no (por lo que '~> 0.9.2.3' 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 tres primeros que especifique (por ejemplo, '~> 0.9.2 'aceptaría cualquier cosa dentro de una serie 0.9.xy, independientemente de de lo que 'y' es, la restricción es que el 9 no se puede incrementar). – eldarerathis

+2

Existe una excepción a la regla de que "RubyGems incrementará el último dígito en la versión": cuando proporcione un dígito. Puede esperar que "~> 4" signifique "Cualquier versión 4 o superior", pero [no] (http://stackoverflow.com/questions/24121960/why-does-the-gemfile-semantic-versioning- operator-produce-inconsistent-resu), así que ten cuidado. – hlascelles

2

@millisami Incluso se puede utilizar para agregar dependencias con el uso de la restricción gemspec pesimista como esto:

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

Si usted no sabe mucho sobre el desarrollo gema o se acaba de entrar en ella, estos son algunos buenas referencias:

  1. Tutorial that teaches you how to make your own RubyGem, the standard practices associated with it, and how to upload it so that others can install it.
  2. How to create a Gem from scratch with Bundler
+0

El primer enlace es un 404 –

Cuestiones relacionadas