Auf der Suche nach bewährten Methoden für die Versionsnummerierung abhängiger Softwarekomponenten


15

Wir versuchen, eine gute Möglichkeit für die Versionsnummerierung von Softwarekomponenten zu finden, die voneinander abhängig sind.

Lassen Sie uns genauer sein:

Softwarekomponente A ist eine Firmware, die auf einem eingebetteten Gerät ausgeführt wird, und Komponente B ist der entsprechende Treiber für einen normalen PC (Linux / Windows-Computer). Sie kommunizieren über ein benutzerdefiniertes Protokoll miteinander. Da sich unser Produkt auch an Entwickler richtet, werden wir stabile und instabile (experimentelle) Versionen beider Komponenten anbieten (die Firmware ist Closed-Source, während der Treiber Open-Source ist). Unsere größte Schwierigkeit ist der Umgang mit API-Änderungen im Kommunikationsprotokoll.

Während wir eine Kompatibilitätsprüfung im Treiber durchgeführt haben - sie prüft, ob die Firmware-Version mit der Treiberversion kompatibel ist -, haben wir begonnen, verschiedene Möglichkeiten der Versionsnummerierung zu diskutieren.

Wir haben eine Lösung gefunden, aber wir wollten auch das Rad neu erfinden. Aus diesem Grund würde ich gerne ein Feedback von der Programmierer- / Softwareentwickler-Community erhalten, da wir der Meinung sind, dass dies ein häufiges Problem ist.

Also hier ist unsere Lösung:

Wir planen, die weit verbreitete Major.Minor.Patch- Versionsnummerierung zu befolgen und gerade / ungerade Minor-Nummern für die stabilen / instabilen Versionen zu verwenden. Wenn wir Änderungen an der API vornehmen, erhöhen wir die untergeordnete Nummer.

Diese Konvention führt zu der folgenden Beispielsituation:

Der derzeitige stabile Zweig ist 1.2.1 und der instabile 1.3.7. Jetzt ändert ein neuer Patch für Unstable die API, wodurch die neue Unstable-Versionsnummer 1.5.0 wird. Sobald der instabile Zweig als stabil angesehen wird, sagen wir in 1.5.3, werden wir ihn als 1.4.0 veröffentlichen.

Ich würde mich über eine Antwort auf eine der folgenden Fragen freuen:

  • Können Sie eine bewährte Methode für die Behandlung der oben beschriebenen Probleme vorschlagen?
  • Denken Sie, dass unsere "benutzerdefinierte" Konvention gut ist?
  • Welche Änderungen würden Sie an der beschriebenen Konvention vornehmen?

2
In Versionsnummern zurückkehren, die auf stable / unstable basieren? Verwirrend, um es gelinde auszudrücken. Habe nur 1.4.0 als noch nie veröffentlicht und 1.5.3 als 1.6.0.
Marjan Venema

3
Es gibt eine Spezifikation für die Versionsnummerierung. Es heißt semantische Versionierung .
Spoike



Positive Bewertung für @Spoike. Du hättest deinen Kommentar beantworten sollen! Wir haben uns endlich mit der Verwendung von semantischem Versoning abgefunden.
Bit-Pirat

Antworten:


19

IMHO-Versionsnummern sind wie Produktnamen. wichtig, dass sie sichtbar sind, aber unwichtig, dass sie eher Dekoration als Inhalt sind.

Dennoch hat die Versionsnummer wie ein Produktname eine Bedeutung. Und das Wichtigste, was Sie tun können, ist, Verwirrung zu vermeiden. Hier sind einige allgemeine Erwartungen in Bezug auf Versionsnummern. In dem Maße, in dem diese Ausnahmen nicht erfüllt sind, wird der Benutzer wahrscheinlich verwirrt sein:

Die Versionsnummern nehmen monoton zu.
Dies ist wahrscheinlich die offensichtlichste Erwartung und gleichzeitig die am wenigsten wahrscheinliche. Auf einen Blick erwartet der Benutzer, dass Version 2.3.5 nach Version 2.2.17 verfügbar ist und dieselbe oder eine bessere Technologie aufweist. Aber natürlich ist 2.3.x ein Entwicklungszweig , und 2.2.x ist stabil , und 2.3.5 wurde bereits 2004 veröffentlicht, und der 2.2-Zweig wird noch aktiv bearbeitet, und 2.2.17 wurde erst letzten April veröffentlicht und enthält. .. na ja, du kommst auf die Idee. Genauso gut können Sie Version 2.2 "Potato" für alle Bedeutungen der Nummer nennen. Willkommen zur Version " Potato-17 " !!

Ähnliche Versionen sind aktualisierbar / kompatibel
Wenn ich Version 3.7 auf meinem Computer habe und 3.8 mit allen neuen glänzenden Frozbots herauskommt, erwarte ich, dass meine Version 3.8 mit einem Upgrade oder Patch oder was auch immer ohne Unterbrechung 3.8 werden kann. Aber wenn ich auf 3.7 bin und Sie 5.2 freigeben, bin ich nicht so optimistisch. Natürlich wäre ich lieber angenehm überrascht als enttäuscht.

Die erste Ziffer ist signifikant.
Ich würde das nicht einmal erwähnen, wenn Java in dieser Angelegenheit nicht so verwirrend wäre. Wenn Ihnen nicht jemand davon erzählt, würden Sie nicht erwarten, dass "Java 7" tatsächlich Version 1.7 ist. Und als Sie das zum ersten Mal hörten, war Ihre Antwort mit ziemlicher Sicherheit: " Was? .. Warum? "

Der Purist wird klar sagen, dass sich die Hauptversionsnummer nur ändern wird, wenn der Plattformwechsel nicht abwärtskompatibel ist. Aber haben Sie tatsächlich die Absicht, die Abwärtskompatibilität jemals aufzugeben ? Oft sind Hauptversions-Revisionen eine Marketingentscheidung, keine technische; Die Java-Absurdität kommt von beiden Lagern, die es zur gleichen Zeit so machen, fast komisch.

Schließlich
geht es bei Versionsnummern, wie ich gerade erwähnte, oft genauso um Marketing wie um Technologie. Und das ist in Ordnung, denn dafür sind Versionsnummern gedacht: Sie informieren Sie auf einen Blick, was an der Software neu ist. Eine große Änderung der Nummer bedeutet eine große Änderung der Funktionalität. Eine geringe Änderung der Anzahl bedeutet fast keine Änderung der Funktionalität. Das erwarten die Leute . Ob dies zutrifft oder nicht, hängt davon ab, ob Ihre Versionsnummern die gleiche Bedeutung haben wie Ihre Benutzer.

- BEARBEITEN -
Ich habe vergessen, dies zu erwähnen, aber Caleb wies freundlich darauf hin: Verwenden Sie keine Versionsnummern, um auf etwas Wichtiges hinzuweisen (z. B. stabil / instabil), ohne es an anderer Stelle explizit zu machen. Ja, Sie wissen, dass die ungerade Nebenversionsnummer Entwicklung anzeigt, aber das macht einen von uns. Debians "instabiler" Veröffentlichungsname ist ein gutes Beispiel; oder Sie könnten auch einen völlig separaten Produktnamen verwenden; "Frozbot 1.2" für Ihren Produktnamen und "Devbot 1.3" für Ihre Entwicklungsversion.


1
Schön gesagt. Zum Schluss möchten Sie möglicherweise Marketingversionen von technischen, intern verwendeten Versionsnummern unterscheiden (dh nicht verwechseln). Wie in Java ist Java 7 eine Marketingversion (klingt alles neu und glänzend), 1.7 ist die technische Version (klingt nach einer geringfügigen Verbesserung, die ziemlich genau ist).
Miraculixx

Auch wenn es hier noch andere gute Antworten gibt, gefällt mir dies am besten, da es die verschiedenen Fallstricke und Anwendungsfälle sehr gut erklärt. Am Ende haben wir uns mit der semantischen Versionierung abgefunden, die oben in einem Kommentar erwähnt wurde und der von Ihnen beschriebenen sehr ähnlich ist.
Bit-Pirat

3

Sobald der instabile Zweig als stabil angesehen wird, sagen wir in 1.5.3, werden wir ihn als 1.4.0 veröffentlichen.

Nein nein Für Unstable 1.5.3 muss Stable mit 1.6.0 beginnen (und 1.4.x fehlt nur, wenn Sie Semantic Versioning verwenden möchten).


3

Sie versuchen, einen Wert zu verwenden, um zwei verschiedene Dinge anzugeben.

Zuerst haben Sie eine "Version", die normalerweise dazu dient, die verschiedenen Releases zu identifizieren und die Reihenfolge anzugeben, in der die Releases erstellt wurden. Wie tylerl sagte, sollte die Version immer größer werden - es macht für Benutzer keinen Sinn (und es könnte auch eine Menge interner Verwirrung verursachen), wenn Sie die Version von 1.5.3 auf 1.4.0 ändern.

Zweitens möchten Sie angeben, ob eine bestimmte Version stabil ist oder nicht.

Es ist möglich , beide Dinge mit einer einzigen "Versionsnummer" zu kennzeichnen, genau wie einige Geschäfte ein Preisschema verwenden, um anzuzeigen, ob ein Artikel zum Verkauf steht. Zum Beispiel sind Preise, die in einem Geschäft in meiner Nähe mit '3' enden, endgültige Verkaufspreise. Das funktioniert gut für die Mitarbeiter, die schnell lernen, wie man einen Verkaufspreis erkennt, aber es ist keine gute Möglichkeit, Ihren Kunden über einen Verkauf zu informieren. Aus diesem Grund platzieren sie auch Schilder in der Nähe der Verkaufsartikel. Sie könnten etwas Ähnliches tun, z. B. die niedrigstwertige Ziffer für stabile Releases gerade und für experimentelle Releases ungerade machen. Ich denke jedoch, wenn Sie etwas veröffentlichen wollen, das experimentell ist, sollten Sie es eindeutig so kennzeichnen. Sie können am Anfang oder Ende der Versionszeichenfolge ein 'X' hinzufügen, wie z.X.1.5.31.5.3.X. Danach können Sie sogar eine experimentelle Versionsnummer eingeben, sodass Sie mehrere experimentelle Versionen veröffentlichen können, die alle auf derselben Basisversion basieren: 1.5.3.X1, 1.5.3.X2.

Sie sollten auch bedenken , dass es eine lange Tradition der Verwendung von „Alpha“ und „Beta“ Versionsnummern Versionen anzuzeigen , die nicht stabil oder vollständig sein können: 1.5.3a54. Stellen Sie sicher, dass Sie einen guten Grund haben, von diesem Schema abzuweichen, wenn Sie sich für etwas anderes entscheiden, da Sie Ihrer Entwickler-Community wahrscheinlich etwas anderes erklären müssen.


1
+1 Brillantes Beispiel: " Preise, die in einem Geschäft in meiner Nähe mit '3' enden, sind endgültige Verkaufspreise ... aber es ist keine großartige Möglichkeit, Ihren Kunden von einem Verkauf zu erzählen. "
tylerl

2

Ich würde vorschlagen, das Format major.minor.patch zu verwenden, wobei eine Erweiterung "tag" für stabile / instabile Versionen und eine eindeutige Bedeutung der Major- und Minor-Nummern verwendet wird:

major.minor.patch-stable|unstable

wo

major  only changes if there are incompatible changes in the API
minor  changes if there are changes in the API but backward compatibility is given
patch  any other changes, could be the build number or any other increasing number
-stable indicates the stable version
-unstable indicates the unstable version

Auf diese Weise lassen sich Abhängigkeiten einfach verwalten und geben jedem Komponenten-Client / Benutzer an, wann er neuen Versionen mehr Aufmerksamkeit schenken muss. ZB wenn Komponente A (1.1.0-stabil) von B (5.4.534-stabil) abhängt und eine neue Version von B fällig ist (6.1.0-instabil), wird einem sofort bewusst, dass A möglicherweise erheblich geändert werden muss .


1

Ich mag die Art und Weise, wie Hibernating Rhinos RavenDb gegenüber Versionen erstellt hat - sie haben nur eine ständig wachsende Build-Nummer. Wenn sie einen stabilen bekommen, wird er als stabil markiert. Aber alles ist ein Release Candidate.


3
Sie haben nur eine immer belastende Build-Nummer - Lieber Gott, ich hoffe, das ist genau das, was Sie gemeint haben. Es ändert wirklich den Kontext von Versionsnummern, wenn sie immer belastender werden.
tylerl

1
Verdammt, du korrigierst es automatisch. . .
Wyatt Barnett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.