Bedeutung von Tilde größer als (~>) in der Versionsanforderung?

92

Was bedeutet die ~>Versionsanforderung in Edelsteinspezifikationen?

hanna-0.1.12 hängt ab von [haml (~> 2.2.8)]
Alexey Chernikov
quelle
27
Es wird manchmal als Spermienoperator bezeichnet.
Andrew Grimm
4
oder Twiddle-Wakka
SuckerForMayhem
3
+1 @SuckerForMayhem, "Twiddle-Wakka" ist lustiger. Neuer Link: guides.rubygems.org/patterns/#pessimistic-version-constraint - , die sich auf Links robots.thoughtbot.com/rubys-pessimistic-operator
The Red Pea
2
@SuckerForMayhem Twiddle-Wakka klingt wie eine Art legendäres Tier wie die Chupacabra. Dies war mein Beitrag zum Thema. Gern geschehen Gesellschaft.
Twiz
1
Danke für aktualisierte Links @TheRedPea
SuckerForMayhem

Antworten:

93

Das RubyGems-Handbuch nennt dies eine pessimistische Versionsbeschränkung .

Angenommen, Sie haben eine n-teilige Versionsnummer angegeben, z. B. 1.3(2-teilig) oder 3.5.6.2(4-teilig) als Einschränkung. Um die Einschränkung zu erfüllen, muss eine Versionsnummer beide der folgenden Bedingungen erfüllen

  1. Die ersten n-1 Teile der Versionsnummer müssen mit den ersten n-1 Teilen der Einschränkung identisch sein (z. B. 1.xoder 3.5.6.xübereinstimmen, aber 0.xoder 3.5.7.xnicht) und

  2. Der letzte Teil der Versionsnummer muss größer als oder gleich dem letzten Teil der Einschränkung (zB 1.9999und 3.5.6.2Spiel, aber 1.2oder 3.5.6.1nicht).

Mit anderen Worten

~> x 1 .x 2 .x 3 . … .X n-2 .x n-1 .x n

Streichhölzer

x 1 .x 2 .x 3 . … .X n-2 .x n-1 .y, y> = x n

Der Grund, warum dies als "pessimistische" Einschränkung bezeichnet wird, und auch der Anwendungsfall dafür, ist, dass Sie, wenn Sie nur sagen > x.y.z, optimistisch sind: Sie gehen davon aus, dass sich die API von nun an bis in alle Ewigkeit niemals ändern wird. Dies ist natürlich eine ziemlich kühne Annahme. Die meisten Projekte haben jedoch Regeln darüber, wann sie die Abwärtskompatibilität aufheben dürfen und wie sie ihre Versionsnummer ändern müssen, wenn sie die Abwärtskompatibilität aufheben. Sie können diese Versionsnummerierungsregeln mit einer pessimistischen Einschränkung codieren und so sicher sein, dass Ihr Code immer weiter funktioniert (vorausgesetzt, der Autor des anderen Projekts hält sich tatsächlich an seine eigenen Regeln, was leider nicht immer der Fall ist ).

Jörg W Mittag
quelle
32
Mit anderen Worten: ~> bedeutet, dass nur diese bestimmte Version und neuere Unterversionen in der letzten Dezimalstelle zugelassen werden.
Magne
18

Mit anderen Worten, Sie können dieses Symbol verwenden, um Ihren Edelstein mit allen kleineren Updates auf dem neuesten Stand zu halten und zu vermeiden, dass größere Updates durchgeführt werden, die Ihre App beschädigen können.

Zum Beispiel wird "~> 1.2" Ihren Edelstein auf 1.3 aktualisieren (wenn eine solche Version veröffentlicht wird), aber nicht auf 2.0

Redjam
quelle
13

Ich denke, Bundler-Dokumente fassen dies am besten zusammen:

Der Bezeichner ~> hat eine besondere Bedeutung, die am besten am Beispiel gezeigt wird. ~> 2.0.3 ist identisch mit> = 2.0.3 und <2.1. ~> 2.1 ist identisch mit> = 2.1 und <3.0. ~> 2.2.beta stimmt mit Vorabversionen wie 2.2.beta.12 überein.

Ari
quelle
1
Ich fürchte, ich nicht. Ich bin froh, dass die akzeptierte Antwort dies ausführlicher erklärt. Diese beispielhafte Erklärung hilft mir nicht wirklich zu verstehen, was der Operator bedeutet.
Tripleee
-1

Es passt zu jeder Version, die den gleichen Haupt- / Nebenanteil hat. Dies bedeutet in diesem Fall, dass haml ~> 2.2.8 mit jeder 2.2.x-Version übereinstimmt.

Dies kann verwendet werden, um sicherzustellen, dass eine API, die die Änderung in einem neuen Edelstein bricht, nicht dazu führt, dass sie von diesem neuen, sondern geänderten Edelstein abhängt, der in diesem Fall hanna brechen würde.

Dirkjan Bussink
quelle
7
Dies ist nicht falsch, aber unvollständig. Es ist wichtig, den Unterschied zwischen ~> 2.0und ~> 2.0.0- den früheren Übereinstimmungen 2.0, 2.1, 2.2.7 und allem anderen bis zu (aber nicht einschließlich) 3.0 zu unterschätzen. Letzteres entspricht 2.0, 2.0.1, 2.0.999 und allem anderen bis 2.1.
James A. Rosen
5
@ James A. Rosen: Wird ~> 2.2.8auch nicht mit "irgendeiner 2.2.x" -Version übereinstimmen, wie die Antwort behauptet, sondern nur mit 2.2.x-Versionen mit x ≥ 8. IOW: Die Antwort ist bestenfalls noch unvollständiger und grenzt an falsch und definitiv irreführend.
Jörg W Mittag