Was ist der Unterschied zwischen ~> und> = bei der Angabe von Rubygem in Gemfile?

120

Ich sehe oft die folgende Notation (~>) in Gemfile.

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

Ich weiß, dass das Vorzeichen (> =) nur größer oder gleich ist, aber was bedeutet die (~>) Notation? Sind beide gleich oder haben sie einen signifikanten Unterschied?

Autodidakt
quelle
6
Siehe auch: Bedeutung der ~>Versionsanforderung .
Jörg W Mittag
28
~>wird manchmal als "Spermienoperator" bezeichnet.
Andrew Grimm
3
Können Sie in Ihrer Gemfile einen Bereich für die Ruby-Version angeben? ZBruby "~>2.0"
Dennis
1
oder genannt Twiddle-Wakka
SuckerForMayhem
@ Tennis hier ist eine Antwort auf Ihre Frage: stackoverflow.com/a/23116552/6359753
Henry Yang

Antworten:

165

Das ist eine pessimistische Versionsbeschränkung . RubyGems erhöht die letzte Ziffer in der bereitgestellten Version und verwendet diese, bis eine maximale Version erreicht ist. Ist ~>0.8.5also semantisch äquivalent zu:

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

Die einfache Möglichkeit, darüber nachzudenken, besteht darin, dass Sie damit einverstanden sind, dass die letzte Ziffer auf einen beliebigen Wert erhöht wird, die in der Zeichenfolge davor stehenden Werte jedoch nicht größer sein können als die von Ihnen angegebenen. Somit ~>0.8.5ist für die dritte Ziffer (die 5) jeder Wert akzeptabel, vorausgesetzt, er ist größer oder gleich 5, aber die führende 0,8 muss "0,8" sein.

Sie können dies beispielsweise tun, wenn Sie der Meinung sind, dass die Version 0.9 einige wichtige Änderungen implementieren wird, Sie jedoch wissen, dass die gesamte Release-Serie 0.8.x nur Bugfixes enthält.

Eine einfache Verwendung ">=0.8.5"würde jedoch bedeuten , dass jede Version, die später als (oder gleich) 0.8.5 ist, akzeptabel ist. Es gibt keine Obergrenze.

Eldarerathis
quelle
Wie verhält sich dies bei Edelsteinen, die für ihre Versionierung vier Ziffern verwenden, z. B. Backbone-on-Rails ?
JJD
2
@JJD: Es sollte im Grunde das gleiche Verhalten sein. Die letzte der vier Ziffern kann ~>0.9.2.3unbegrenzt inkrementiert werden, die dritte jedoch nicht (dies würde v0.9.2.4 oder v0.9.2.23, aber nicht v0.9.3.0 ermöglichen). Wenn Sie in der Einschränkung nur 3 Ziffern angegeben haben, ist die vierte im Wesentlichen irrelevant - sie wird nur auf der Grundlage der ersten drei von Ihnen angegebenen Ziffern eingeschränkt (z. B. ~>0.9.2würde alles innerhalb einer 0.9.xy-Reihe akzeptiert, unabhängig davon, was yist; die Einschränkung ist dass die 9 nicht erhöht werden kann).
Eldarerathis
3
Es gibt jedoch eine Ausnahme von der Regel, dass "RubyGems die letzte Ziffer in der Version erhöht": Wenn Sie eine Ziffer angeben. Sie können erwarten, dass "~> 4" "Jede Version 4 oder höher" bedeutet, aber das ist nicht der Fall. Seien Sie also vorsichtig.
Hlascelles
2
Was ist mit ~> 0,1 vs. ~> 0,1,0? Wenn wir es als "Sie sind damit einverstanden, dass die letzte Ziffer auf einen beliebigen Wert erhöht wird" betrachten, bedeutet ~> 0,1> = 0.1.0 <1.0.0, während ~> 0.1.0> = 0.1.0 <bedeutet 0.2.0. Ist das korrekt?
Wei
Wenn ich ein GitHub-Projekt sehe, das besagt, dass Ruby> = 2.4.4 erforderlich ist, kann ich davon ausgehen, dass alle Ruby nach 2.4.4 unterstützt werden, einschließlich 2.5.1 und sogar Ruby 3? Oder sollten wir auf Nummer sicher gehen (dh anstatt zu glauben, dass sie alle Rubine nach 2.4.4 einschließlich unterstützen, sollten sie meinen, dass sie vor 2.4.4 keine Rubine unterstützen)?
Henry Yang
3

@millisami Sie können sogar Abhängigkeiten mit der gemspec hinzufügen, indem Sie die pessimistische Einschränkung wie folgt verwenden:

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

Wenn Sie nicht viel über die Edelsteinentwicklung wissen oder gerade erst damit anfangen, sind dies einige gute Referenzen:

  1. Tutorial, in dem Sie lernen, wie Sie Ihr eigenes RubyGem erstellen, welche Standardpraktiken damit verbunden sind und wie Sie es hochladen, damit andere es installieren können.
  2. So erstellen Sie mit Bundler einen Edelstein von Grund auf neu
Strangeloops
quelle
1
Der erste Link ist ein 404
Petr Gazarov