2010-11-27 12 views
101

Często widzę następującą notację (~>) w Gemfile.Jaka jest różnica między ~> i> = podczas określania rubygem w Gemfile?

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

wiem znak (> =) jest po prostu większa lub równa, ale co robi (~>) notacja oznacza? Czy są one takie same lub mają jakąś znaczącą różnicę?

+6

Zobacz też: [Znaczenie '~>' w wymaganiu wersji] (http://StackOverflow.Com/q/3414337/#3416289). –

+20

'~>' jest czasami nazywane "operatorem spermy". –

+2

Czy możesz określić zakres dla wersji Ruby w swoim Gemfile? Na przykład. 'ruby" ~> 2.0 "' – Dennis

Odpowiedz

141

To jest pessimistic version constraint. RubyGems zwiększy ostatnią cyfrę w dostarczonej wersji i użyje jej, dopóki nie osiągnie maksymalnej wersji. Więc ~>0.8.5 jest semantycznie równoważne:

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

w prosty sposób, aby myśleć o to, że jesteś w porządku z ostatnią cyfrą zwiększany do jakiejś arbitralnej wartości, ale te poprzedzające go w ciągu nie może być większa niż to, co podałeś. Tak więc dla ~>0.8.5, każda wartość jest akceptowalna dla trzeciej cyfry (5) pod warunkiem, że jest większa lub równa 5, ale wiodąca wartość 0,8 musi wynosić "0,8".

Możesz to zrobić, na przykład, jeśli myślisz, że wersja 0.9 zamierza wprowadzić pewne zmiany łamania, ale wiesz, że cała seria wydań 0.8.x to tylko poprawki.

Jednak użycie po prostu ">=0.8.5" może oznaczać, że dowolna wersja jest późniejsza niż (lub równa) 0.8.5. Nie ma górnej granicy.

+0

Jak to się dzieje w przypadku klejnotów, które używają czterech cyfr do ich wersji, takich jak [szkielet -nie-szyny] (https://github.com/meleyal/backbone-on-rails)? – JJD

+2

@JJD: Powinno to być zasadniczo takie samo zachowanie. Ostatnia cyfra czterech może zostać zwiększona bez powiązania, ale trzecia nie będzie (więc ~ ~> 0.9.2.3 "pozwoliłoby na v0.9.2.4 lub v0.9.2.23, ale nie na v0.9.3.0). Jeśli w ograniczeniu określono tylko 3 cyfry, czwarty byłby w zasadzie nieistotny - byłby ograniczony tylko na podstawie pierwszych trzech określonych przez użytkownika (np. '~> 0.9.2" zaakceptowałby wszystko w ramach serii 0.9.xy, niezależnie tego, czym jest "y", ograniczenie polega na tym, że 9 nie może być inkrementowane). – eldarerathis

+2

Istnieje wyjątek od reguły, że "RubyGems zwiększy ostatnią cyfrę w wersji" chociaż: gdy podasz jedną cyfrę. Możesz oczekiwać, że "~> 4" będzie oznaczać "Każda wersja 4 lub wyższa", ale [to nie] (http://stackoverflow.com/questions/24121960/why-does-the-gemfile-semantic-versioning- operator-produce-inconsistent-resu), więc bądź ostrożny. – hlascelles

2

@millisami Można nawet użyć, aby dodać zależnościami z gemspec pomocą pesymistyczny ograniczenie takiego:

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

Jeśli nie wiem zbyt wiele o rozwoju gem lub dopiero się do niego, to tylko niektóre dobre referencje:

  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

Pierwszy link to 404 –

Powiązane problemy