Schrittweise: Versionsnummern richtig vergeben

Um eine Versionsnummer zu vergeben, muss man sich für ein System entscheiden – bloß für welches? Jahreszahlen oder klassische Versionsnummern? Ohne oder mit Nachkommastellen? SemVer definiert einen einheitlichen und leicht verständlichen Standard.

In Pocket speichern vorlesen Druckansicht 18 Kommentare lesen
Lesezeit: 5 Min.
Von
  • Golo Roden
Inhaltsverzeichnis

Es gibt zahlreiche Verfahren, eine Versionsnummer zu vergeben: Waren unter MS-DOS Haupt- und Nebenversionsnummern gängig, wurde Windows hingegen zumindest zeitweise mit einer Jahreszahl gekennzeichnet. Inzwischen ist Microsoft wieder zu der klassischen Zählweise zurückgekehrt, verzichtet allerdings bei Windows 7 und 8 auf die Nebenversionsnummer.

Im Consumerbereich haben sich vierstellige Jahreszahlen als Versionsnummer inzwischen etabliert. Dennoch existiert die klassische Versionsnummer in der Regel weiterhin, auf die sich Entwickler denn auch gerne beziehen. Beispielsweise entsprechen Visual Studio 2012 und Office 2013 den intern gepflegten Versionsnummern 11.0 und 15.0.

Entwickler stehen vor der Frage, nach welchem Schema sie eine eigenentwickelte Software versionieren. Eine insbesondere im Unix- und Webumfeld verbreitete Alternative stellt das sogenannte "Semantic Versioning" dar, häufig als SemVer abgekürzt. Das Verfahren definiert eine Versionsnummer in der einfachsten Variante als Kombination dreier Zahlen: einer Hauptversions-, einer Nebenversions- und einer Revisionsnummer, die jeweils einer nichtnegativen Ganzzahl entsprechen.

Die Zählung beginnt zunächst bei der Versionsnummer 0.0.1. Anschließend werden die einzelnen Nummern nach vordefinierten Kriterien hochgezählt, wobei eine Veränderung der Hauptversion die Nebenversion und eine Veränderung der Nebenversion die Revision jeweils auf den Wert 0 zurücksetzt. Wichtig ist, dass eine einzelne Nummer nicht zwingend einstellig sein muss: Auf die Versionsnummer 0.9.x folgt also nicht zwingend 1.0.0, sondern gegebenenfalls zunächst die Version 0.10.0.

Das Hochzählen der einzelnen Nummern erfolgt dabei gemäß den folgenden Regeln:

  • Behebt der Entwickler lediglich einen Fehler, ohne die Abwärtskompatibilität zu beeinträchtigen, wird lediglich die Revisionsnummer um 1 erhöht – beispielsweise von 1.0.18 auf 1.0.19.
  • Fügt der Entwickler neue Funktionalität hinzu, wird hingegen die Nebenversionsnummer um 1 erhöht, vorausgesetzt, die neu hinzugefügte Funktionalität beeinträchtigt die Abwärtskompatibilität nicht – beispielsweise von 1.0.19 auf 1.1.0.
  • Beeinträchtigt der Entwickler die Abwärtskompatibilität, wird schließlich die Hauptversionsnummer um 1 erhöht – beispielsweise von 1.1.0 auf 2.0.0.

All das gilt allerdings erst dann, wenn die Version 1.0.0 bereits erreicht wurde. Das ist definiert als diejenige Version, die die API erstmalig in stabiler Form veröffentlicht. Davor, das heißt, während den Versionen 0.x.y, kann sich die API jederzeit beliebig ändern.

Optional kann man eine Versionsnummer um ein Suffix ergänzen, um Vorabversionen zu kennzeichnen. Ein solches Suffix wird durch einen Trennstrich eingeleitet und besteht danach aus beliebigen alphanumerischen Zeichen, beispielsweise 1.0.0-beta1.

Für diese Suffixe gilt die normale, alphabetische Sortierung. Deshalb ist die Version 1.0.0-alpha als kleiner anzusehen als die Version 1.0.0-beta. Eine Versionsnummer ohne Suffix ist per Definition jedoch immer größer als die gleiche Version mit Suffix. Daher gilt also, dass die Version 1.0.0-beta kleiner ist als die Version 1.0.0.

Für Entwickler, die Anwendungen auf Basis von Node.js schreiben, gehört SemVer bereits zum Alltag: Die Paketverwaltung npm verwendet dieses Versionierungsschema nämlich intern, unter anderem für das Auflösen von Abhängigkeiten während der Installation von Modulen.

Das Modul node-semver, das Isaac Z. Schlueter zunächst für die von ihm entwickelte Paketverwaltung npm geschrieben hat, kann man allerdings auch in beliebigen anderen Anwendungen verwenden, um Versionsnummern zu analysieren und zu vergleichen. Dazu muss man node-semver lediglich auf dem üblichen Weg in den lokalen Kontext der Anwendung installieren:

$ npm install semver

Anschließend stehen verschiedene Funktionen zur Verfügung, um beispielsweise die Gültigkeit einer Versionsnummer zu ermitteln. Dazu dient die Funktion valid, die im Fall einer gültigen Versionsnummer ebendiese wieder zurückgibt, im Fall einer ungültigen jedoch das Literal null:

console.log(semver.valid('0.0.19')); // => 0.0.19
console.log(semver.valid('x.y.z')); // => null

Die Dokumentation zu node-semver listet weitere Anwendungsfälle auf.

Alternativ ist es auch möglich, node-semver in den globalen Kontext zu installieren. In diesem Fall kann man semver als Anweisung auf der Konsole aufrufen und eine zu prüfende Versionsnummer übergeben:

$ semver 0.0.19

tl;dr: Node.js und dessen Paketverwaltung npm verwenden als Versionierungsschema das Semantic Versioning (SemVer). Das Modul node-semver, das ursprünglich für npm entwickelt wurde, kann man in eigenen Anwendungen und auf der Konsole verwenden, um Versionsnummern zu analysieren und zu vergleichen. ()