2010-11-27 19 views
101

Spesso vedo la seguente notazione (~>) in Gemfile.Qual è la differenza tra ~> e> = quando si specifica rubygem in Gemfile?

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

So che il segno (> =) è solo maggiore o uguale a, ma che cosa vuol dire la (~>) la notazione? Sono entrambi uguali o hanno una differenza significativa?

+6

Vedere anche: [Significato di ~ ~> 'nei requisiti di versione] (http://StackOverflow.Com/q/3414337/#3416289). –

+20

'~>' è talvolta chiamato "operatore spermatico". –

+2

Puoi specificare un intervallo per la versione Ruby nel tuo Gemfile? Per esempio. 'ruby" ~> 2.0 "' – Dennis

risposta

141

Questo è un pessimistic version constraint. RubyGems incrementerà l'ultima cifra nella versione fornita e la userà fino a raggiungere la versione massima. Così ~>0.8.5 è semanticamente equivalente a:

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

Il modo più facile pensare a questo proposito è che stai bene con l'ultima cifra incremento di un valore arbitrario, ma quelli che lo precedono nella stringa non può essere maggiore di quello che hai fornito. Pertanto, per ~>0.8.5, qualsiasi valore è accettabile per la terza cifra (la 5) a condizione che sia maggiore o uguale a 5, ma la 0.8 iniziale deve essere "0.8".

Si potrebbe fare questo, ad esempio, se si pensa che la versione 0.9 sta per implementare alcune modifiche di rottura, ma si sa che l'intera serie di release 0.8.x è solo bugfix.

Tuttavia, utilizzare semplicemente ">=0.8.5" indica che qualsiasi versione successiva a (o uguale a) 0.8.5 è accettabile. Non c'è limite superiore.

+0

Come si comporta questo con gemme che usano quattro cifre per il loro versioning come [backbone -on-rails] (https://github.com/meleyal/backbone-on-rails)? – JJD

+2

@JJD: Dovrebbe essere fondamentalmente lo stesso comportamento. L'ultima cifra dei quattro può essere incrementata senza vincoli, ma la terza no (quindi '~> 0.9.2.3' consentirebbe v0.9.2.4 o v0.9.2.23 ma non v0.9.3.0). Se hai specificato solo 3 cifre nel vincolo, il quarto sarebbe sostanzialmente irrilevante - sarebbe limitato solo in base ai primi tre che hai specificato (ad esempio, '~> 0.9.2' accetterebbe qualsiasi cosa all'interno di una serie 0.9.xy, indipendentemente di ciò che 'y' è, il vincolo è che il 9 non può essere incrementato). – eldarerathis

+2

Esiste un'eccezione alla regola che "RubyGems incrementerà l'ultima cifra nella versione": quando si fornisce una cifra. Ci si potrebbe aspettare che "~> 4" significhi "Qualsiasi versione 4 o successiva", ma [non lo fa] (http://stackoverflow.com/questions/24121960/why-does-the-gemfile-semantic-versioning- operatore-produrre-incoerente-resu), quindi fai attenzione. – hlascelles

2

@millisami Si può anche utilizzare per aggiungere le dipendenze con la gemspec utilizzando il vincolo pessimista in questo modo:

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

Se non si conosce molto circa lo sviluppo gemma o sono solo entrare in esso, questi sono alcuni buone referenze:

  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

Il primo collegamento è un 404 –

Problemi correlati