Quelle est la différence entre ~> et> = lors de la spécification de rubygem dans Gemfile?


120

Je vois souvent la notation suivante (~>) dans Gemfile.

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

Je sais que le signe (> =) est juste supérieur ou égal à, mais que signifie la notation (~>)? Sont-ils tous les deux identiques ou présentent-ils une différence significative?



28
~>est parfois appelé un «opérateur de sperme».
Andrew Grimm

3
Pouvez-vous spécifier une plage pour la version Ruby dans votre Gemfile? Par exempleruby "~>2.0"
Dennis


@Dennis voici une réponse à votre question: stackoverflow.com/a/23116552/6359753
Henry Yang

Réponses:


165

C'est une contrainte de version pessimiste . RubyGems incrémentera le dernier chiffre de la version fournie et l'utilisera jusqu'à ce qu'il atteigne une version maximale. Donc ~>0.8.5est sémantiquement équivalent à:

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

Le moyen le plus simple d'y penser est que vous êtes d'accord avec l'incrémentation du dernier chiffre à une valeur arbitraire, mais ceux qui le précèdent dans la chaîne ne peuvent pas être supérieurs à ce que vous avez fourni. Ainsi pour ~>0.8.5, toute valeur est acceptable pour le troisième chiffre (le 5) à condition qu'elle soit supérieure ou égale à 5, mais le premier 0,8 doit être "0,8".

Vous pouvez le faire, par exemple, si vous pensez que la version 0.9 va implémenter des changements de rupture, mais que vous savez que toute la série de versions 0.8.x n'est que des corrections de bogues.

Cependant, utiliser simplement ">=0.8.5"indiquerait que toute version ultérieure (ou égale à) 0.8.5 est acceptable. Il n'y a pas de limite supérieure.


Comment cela se comporte-t-il avec les gemmes qui utilisent quatre chiffres pour leur gestion des versions, telles que le backbone-on-rails ?
JJD

2
@JJD: Cela devrait être fondamentalement le même comportement. Le dernier chiffre des quatre peut être incrémenté sans limite, mais le troisième ne le ferait pas (ainsi ~>0.9.2.3autoriserait v0.9.2.4 ou v0.9.2.23 mais pas v0.9.3.0). Si vous ne spécifiez que 3 chiffres dans la contrainte, le quatrième serait essentiellement non pertinent - il ne serait contraint que sur la base des trois premiers que vous spécifiez (par exemple ~>0.9.2, accepterait tout ce qui se trouve dans une série 0.9.xy, indépendamment de ce qui yest; la contrainte est que le 9 ne peut pas être incrémenté).
eldarerathis

3
Il existe une exception à la règle selon laquelle "RubyGems incrémentera le dernier chiffre de la version": lorsque vous fournissez un chiffre. Vous pouvez vous attendre à ce que "~> 4" signifie "N'importe quelle version 4 ou supérieure", mais ce n'est pas le cas , alors soyez prudent.
hlascelles

2
Qu'en est-il de ~> 0,1 contre ~> 0,1,0? Si nous pensons que "vous êtes d'accord avec l'incrémentation du dernier chiffre à une valeur arbitraire", ~> 0,1 se traduit par> = 0,1,0 <1,0,0 tandis que ~> 0,1,0 se traduit par> = 0,1,0 < 0.2.0. Est-ce exact?
Wei

Quand je vois un projet GitHub disant qu'il nécessite ruby> = 2.4.4, puis-je supposer qu'ils prennent en charge tous les rubis après 2.4.4, y compris 2.5.1 et même ruby ​​3? Ou devrions-nous jouer prudemment (c'est-à-dire au lieu de penser qu'ils prendront en charge tous les rubis après 2.4.4 inclus, je devrais penser qu'ils signifient qu'ils ne supporteront aucun rubis avant 2.4.4)?
Henry Yang

3

@millisami Vous pouvez même utiliser pour ajouter des dépendances avec le gemspec en utilisant la contrainte pessimiste comme celle-ci:

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

Si vous ne savez pas grand-chose sur le développement de gemmes ou si vous vous y lancez, voici quelques bonnes références:

  1. Tutoriel qui vous apprend à créer votre propre RubyGem, les pratiques standard qui lui sont associées et comment le télécharger pour que d'autres puissent l'installer.
  2. Comment créer une gemme à partir de zéro avec Bundler

1
Le premier lien est un 404
Petr Gazarov
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.