Aufgrund meiner Erfahrung mit komplexem Abhängigkeitsmanagement auf Unternehmensebene und Release-Versionierung empfehle ich einen Ansatz, den ich gerne als semisemantische Versionierung bezeichne .
Grundsätzlich baut es auf Semantic Versioning 2.0 auf , ist aber nicht ganz so streng.
Semisemantische Versionssegmente:
<primary.release.segment>[-<pre.release.segment>][+<post.release.segment>]
Primäres Release-Segmentformat:
MARKETTING.MAJOR.MINOR.PATCH
Jedes Segment sollte alphanumerische Zeichen zulassen, für logische inkrementelle Änderungen werden jedoch reine Zahlen empfohlen.
Wie bei SemVer empfehle ich Major-, Minor- und Patch-Komponenten , um Reverse-Kompatibilitätsstufen darzustellen, aber ich empfehle auch, eine Marketing-Komponente voranzustellen . Auf diese Weise können Produktbesitzer, Feature-Epen / Gruppen und geschäftliche Probleme die Hauptkomponente unabhängig von technischen Kompatibilitätsproblemen stoßen.
Im Gegensatz zu anderen Antworten empfehle ich nicht, eine Build-Nummer an das primäre Segment anzuhängen. Fügen Sie stattdessen ein Post-Release-Segment nach einem '+' hinzu (Beispiel: 1.1.0.0 + build.42). SemVer nennt diese Build-Metadaten, aber ich denke, das Post-Release-Segment ist klarer. Dieses Segment eignet sich hervorragend zum Deklarieren der Suffixdaten als nicht mit den Kompatibilitätsinformationen im primären Release-Segment verbunden. Ihren kontinuierlichen Integrations-Builds kann dann die vorherige Versionsnummer zugewiesen werden, an die eine inkrementelle Build-Nummer angehängt wird, die nach jeder primären Version zurückgesetzt wird (Beispiel: 1.1.0.0 -> 1.1.0.0 + build.1 -> 1.1.0.0 + build.2 -> 1.1.0.1). Einige Leute möchten alternativ die svn-Revisionsnummer hier oder das git commit sha einfügen, um die Verknüpfung mit dem Code-Repository zu vereinfachen. Eine andere Möglichkeit besteht darin, das Post-Release-Segment für Hotfixes und Patches zu verwenden. Es kann jedoch sinnvoll sein, eine neue primäre Release-Komponente hinzuzufügen. Es kann immer gelöscht werden, wenn die Patch-Komponente inkrementiert wird, da die Versionen effektiv linksbündig ausgerichtet und sortiert sind.
Zusätzlich zu den Release- und Post-Release-Segmenten möchten Benutzer häufig ein Pre-Release-Segment verwenden , um nahezu stabile Pre-Releases wie Alphas, Betas und Release-Kandidaten anzuzeigen. Der SemVer-Ansatz funktioniert gut, aber ich empfehle, numerische Komponenten von alphanumerischen Klassifikatoren zu trennen (z. B. 1.2.0.0 + alpha.2 oder 1.2.0.0 + RC.2). Normalerweise stoßen Sie das Release-Segment gleichzeitig mit dem Hinzufügen des Post-Release-Segments an und löschen das Pre-Release-Segment, wenn Sie das primäre Release-Segment das nächste Mal anstoßen (Beispiel: 1.0.1.2 -> 1.2.0.0-RC.1 - > 1.2.0.0). Pre-Release-Segmente werden hinzugefügt, um anzuzeigen, dass die Release-Version verfügbar ist. In der Regel handelt es sich lediglich um einen festen Satz von Funktionen für eingehendere Tests und Freigaben, die sich aufgrund weiterer Commits nicht von Minute zu Minute ändern.
Das Schöne daran, all dies semantisch so definiert zu haben, dass es fast alle Anwendungsfälle abdeckt, ist, dass Sie sie auf standardmäßige Weise analysieren, sortieren, vergleichen und inkrementieren können. Dies ist besonders wichtig, wenn CI-Systeme für komplexe Anwendungen mit vielen kleinen, unabhängig versionierten Komponenten (wie Mikrodiensten) mit jeweils eigenen verwalteten Abhängigkeiten verwendet werden.
Wenn Sie interessiert sind, habe ich einen semisemantischen Parser in Ruby geschrieben . Ich musste dieses Muster nicht nur verwenden, sondern auch andere Apps verwalten können, die es verwendeten.