Qual è la differenza tra ~> e> = quando si specifica rubygem in Gemfile?


120

Vedo spesso la seguente notazione (~>) in Gemfile.

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

So che il segno (> =) è solo maggiore o uguale a, ma cosa significa la notazione (~>)? Sono entrambi uguali o hanno differenze significative?



28
~>a volte è chiamato "operatore spermatico".
Andrew Grimm,

3
Puoi specificare un intervallo per la versione Ruby nel tuo Gemfile? Ad esempioruby "~>2.0"
Dennis


@Dennis ecco una risposta alla tua domanda: stackoverflow.com/a/23116552/6359753
Henry Yang

Risposte:


165

Questo è un vincolo di versione pessimistico . RubyGems incrementerà l'ultima cifra nella versione fornita e la utilizzerà fino a raggiungere una versione massima. Quindi ~>0.8.5è semanticamente equivalente a:

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

Il modo più semplice per pensarci è che stai bene con l'ultima cifra che aumenta a un valore arbitrario, ma quelli che la precedono nella stringa non possono essere maggiori di quello che hai fornito. Pertanto per ~>0.8.5, qualsiasi valore è accettabile per la terza cifra (il 5) a condizione che sia maggiore o uguale a 5, ma lo 0,8 iniziale deve essere "0,8".

Potresti farlo, ad esempio, se pensi che la versione 0.9 implementerà alcune modifiche sostanziali, ma sai che l'intera serie di versioni 0.8.x è solo correzioni di bug.

Tuttavia, il semplice utilizzo ">=0.8.5"indicherebbe che qualsiasi versione successiva (o uguale a) 0.8.5 è accettabile. Non esiste un limite superiore.


Come si comporta con le gemme che usano quattro cifre per il loro controllo delle versioni, come backbone-on-rails ?
JJD

2
@ JJD: dovrebbe essere fondamentalmente lo stesso comportamento. L'ultima cifra dei quattro può essere incrementata senza limiti, ma la terza no (quindi ~>0.9.2.3consentirebbe v0.9.2.4 o v0.9.2.23 ma non v0.9.3.0). Se si specificano solo 3 cifre nel vincolo, la quarta sarebbe essenzialmente irrilevante: sarebbe vincolata solo in base alle prime tre specificate (ad esempio ~>0.9.2, accetterebbe qualsiasi cosa all'interno di una serie 0.9.xy, indipendentemente da ciò che yè; il vincolo è che il 9 non può essere incrementato).
eldarerathis

3
C'è un'eccezione alla regola che "RubyGems incrementerà l'ultima cifra nella versione" però: quando fornisci una cifra. Potresti aspettarti che "~> 4" significhi "Qualsiasi versione 4 o successiva", ma non è così, quindi fai attenzione.
hlascelles

2
Che dire di ~> 0.1 contro ~> 0.1.0? Se pensiamo che "stai bene con l'ultima cifra che aumenta a un valore arbitrario", ~> 0.1 si traduce in> = 0.1.0 <1.0.0 mentre ~> 0.1.0 si traduce in> = 0.1.0 < 0.2.0. È corretto?
Wei

Quando vedo un progetto GitHub che dice che richiede ruby> = 2.4.4, posso presumere che supportino tutto ruby ​​dopo 2.4.4 incluso 2.5.1 e persino ruby ​​3? O dovremmo giocare sul sicuro (cioè invece di pensare che supporteranno tutti i rubini dopo 2.4.4 compreso, dovrei pensare che non supporteranno alcun rubino prima della 2.4.4)?
Henry Yang

3

@millisami Puoi anche usare per aggiungere dipendenze con gemspec usando il vincolo pessimistico come questo:

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

Se non sai molto sullo sviluppo di gemme o ci stai solo entrando, questi sono alcuni buoni riferimenti:

  1. Tutorial che ti insegna come creare il tuo RubyGem, le pratiche standard ad esso associate e come caricarlo in modo che altri possano installarlo.
  2. Come creare una gemma da zero con Bundler

1
Il primo collegamento è un 404
Petr Gazarov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.