class Gem::Version

Die Klasse Version verarbeitet Zeichenketten-Versionen zu vergleichbaren Werten. Eine Versionszeichenkette sollte normalerweise eine Reihe von Zahlen sein, die durch Punkte getrennt sind. Jeder Teil (Ziffern, die durch Punkte getrennt sind) wird als eigene Zahl betrachtet und diese werden zum Sortieren verwendet. So sortiert beispielsweise 3.10 höher als 3.2, da zehn größer als zwei ist.

Wenn ein Teil Buchstaben enthält (derzeit werden nur a-z unterstützt), dann gilt diese Version als Vorabveröffentlichung (prerelease). Versionen mit einem Vorabveröffentlichungs-Teil im N-ten Teil sortieren niedriger als Versionen mit N-1 Teilen. Vorabveröffentlichungs-Teile werden alphabetisch sortiert, unter Verwendung der normalen Ruby-Zeichenketten-Sortierregeln. Wenn ein Vorabveröffentlichungs-Teil sowohl Buchstaben als auch Zahlen enthält, wird er in mehrere Teile aufgeteilt, um ein erwartetes Sortierverhalten zu gewährleisten (1.0.a10 wird zu 1.0.a.10 und ist größer als 1.0.a9).

Vorabveröffentlichungen sortieren zwischen echten Veröffentlichungen (neueste zu älteste)

  1. 1.0

  2. 1.0.b1

  3. 1.0.a.2

  4. 0.9

Wenn Sie eine Versionsbeschränkung angeben möchten, die sowohl Vorabveröffentlichungen als auch reguläre Veröffentlichungen der 1.x-Serie umfasst, ist dies der beste Weg

s.add_dependency 'example', '>= 1.0.0.a', '< 2.0.0'

Wie sich Software ändert

Benutzer erwarten, eine Versionsbeschränkung angeben zu können, die ihnen eine gewisse begründete Erwartung gibt, dass neue Versionen einer Bibliothek mit ihrer Software funktionieren, wenn die Versionsbeschränkung wahr ist, und nicht funktionieren, wenn die Versionsbeschränkung falsch ist. Mit anderen Worten: Das perfekte System akzeptiert alle kompatiblen Versionen der Bibliothek und lehnt alle inkompatiblen Versionen ab.

Bibliotheken ändern sich auf 3 Arten (nun ja, mehr als 3, aber konzentrieren wir uns hier!)

  1. Die Änderung kann nur ein Implementierungsdetail sein und hat keine Auswirkungen auf die Client-Software.

  2. Die Änderung kann neue Funktionen hinzufügen, dies jedoch auf eine Weise, die für Client-Software, die für eine frühere Version geschrieben wurde, weiterhin kompatibel ist.

  3. Die Änderung kann die öffentliche Schnittstelle der Bibliothek so ändern, dass alte Software nicht mehr kompatibel ist.

An dieser Stelle sind einige Beispiele angebracht. Angenommen, ich habe eine Stack-Klasse, die eine push und eine pop Methode unterstützt.

Beispiele für Änderungen der Kategorie 1

Beispiele für Änderungen der Kategorie 2 könnten sein

Beispiele für Änderungen der Kategorie 3 könnten sein

RubyGems Rational Versionierung

Beispiele

Arbeiten wir den Lebenszyklus eines Projekts mit unserem obigen Stack-Beispiel durch.

Version 0.0.1

Die ursprüngliche Stack-Klasse wird veröffentlicht.

Version 0.0.2

Umstellung auf eine verkettete Listenimplementierung, weil das cooler ist.

Version 0.1.0

Hinzufügen einer depth-Methode.

Version 1.0.0

Hinzufügen von top und machen von pop nil zurückgeben (pop gab früher das alte oberste Element zurück).

Version 1.1.0

push gibt jetzt den gepushten Wert zurück (es gab früher nil zurück).

Version 1.1.1

Fehler in der Implementierung der verketteten Liste behoben.

Version 1.1.2

Fehler behoben, der im letzten Fix eingeführt wurde.

Client A benötigt einen Stack mit grundlegender Push/Pop-Funktionalität. Er schreibt gegen die ursprüngliche Schnittstelle (kein top), daher sieht seine Versionsbeschränkung so aus

gem 'stack', '>= 0.0'

Im Wesentlichen ist jede Version für Client A in Ordnung. Eine inkompatible Änderung der Bibliothek wird ihm Ärger bereiten, aber er ist bereit, das Risiko einzugehen (wir nennen Client A optimistisch).

Client B ist wie Client A, außer bei zwei Dingen: (1) Er verwendet die Methode depth und (2) er macht sich Sorgen über zukünftige Inkompatibilitäten, daher schreibt er seine Versionsbeschränkung so

gem 'stack', '~> 0.1'

Die Methode depth wurde in Version 0.1.0 eingeführt, daher ist diese Version oder alles spätere in Ordnung, solange die Version unter Version 1.0 bleibt, wo Inkompatibilitäten eingeführt werden. Wir nennen Client B pessimistisch, weil er sich Sorgen über inkompatible zukünftige Änderungen macht (es ist in Ordnung, pessimistisch zu sein!).

Verhinderung von Version-Katastrophen

Von: www.zenspider.com/ruby/2008/10/rubygems-how-to-preventing-catastrophe.html

Nehmen wir an, Sie hängen vom fnord-Gem der Version 2.y.z ab. Wenn Sie Ihre Abhängigkeit als „>= 2.0.0“ angeben, sind Sie also auf der sicheren Seite, oder? Was passiert, wenn fnord 3.0 herauskommt und nicht abwärtskompatibel mit 2.y.z ist? Ihre Sachen werden aufgrund der Verwendung von „>=“ kaputt gehen. Der bessere Weg ist, Ihre Abhängigkeit mit einem „ungefähren“ Versionsspezifizierer („~>“) anzugeben. Sie sind etwas verwirrend, also hier ist, wie die Abhängigkeitsspezifizierer funktionieren

Specification From  ... To (exclusive)
">= 3.0"      3.0   ... &infin;
"~> 3.0"      3.0   ... 4.0
"~> 3.0.0"    3.0.0 ... 3.1
"~> 3.5"      3.5   ... 4.0
"~> 3.5.0"    3.5.0 ... 3.6
"~> 3"        3.0   ... 4.0

Für das letzte Beispiel werden einstellige Versionen automatisch mit einer Null erweitert, um ein sinnvolles Ergebnis zu erzielen.