Die Nordlicht Reisen GmbH hat drei Arten von Ergebnissen aus ihren Pipelines: die Preisbibliothek als Paket, das Buchungsportal als Container und ein internes Werkzeug als ZIP-Datei. Bisher heißen alle „latest“, und niemand weiß, welcher Stand in Produktion läuft. Sie sollen für jedes Ergebnis ein Versionsschema festlegen und begründen.
Die Prüfung nennt zwei Fähigkeiten: Versionierung von Abhängigkeiten (SemVer, CalVer) und Versionierung von Pipeline-Artefakten.
Vorwissen: K3, Lektion 3.7.4 lehrt SemVer mit der Entscheidung, welche Stelle steigt, die Version aus einem Git-Tag mit MinVer samt genug Verlauf im Checkout, dotnet pack, die Kennzeichnung von Container-Images mit der Version der App und die Version unter /health. Das wiederholt diese Lektion nicht. Sie ergänzt, was die Prüfung zusätzlich verlangt: CalVer als Alternative, die Sortierregeln und Grenzen von NuGet, die Laufnummern der Pipelines als Versionsquelle und die Entscheidung je Ergebnisart. Feeds und Ansichten, in denen Versionen sichtbar werden, stehen in Lektion 3.1.
SemVer, wie NuGet es liest
Microsofts Seite „Package versioning“ beschreibt eine Version als Major.Minor.Patch[-Suffix]:
| Teil | Bedeutung |
|---|---|
| Major | bricht Bestehendes |
| Minor | neue Funktionen, abwärtskompatibel |
| Patch | nur abwärtskompatible Fehlerbehebungen |
-Suffix (optional) |
ein Bindestrich und ein Text, der eine Vorabversion (pre-release) kennzeichnet |
Beispiele von Microsoft: 1.0.1, 6.11.1231, 4.3.1-rc, 2.2.44-beta.1. Technisch kann ein Paketautor jeden Text als Suffix nehmen; NuGet behandelt jede solche Version als Vorabversion und deutet sie nicht weiter, die Deutung bleibt dem Nutzer überlassen. Üblich sind -alpha (in Arbeit, Experimente), -beta (funktionsvollständig, aber mit bekannten Fehlern) und -rc (Release Candidate, womöglich final).
Sortierung
Nach der SemVer-Regel steht eine Version ohne Suffix vor Vorabversionen derselben Nummer. Vorabversionen ordnet NuGet rückwärts alphabetisch und Zahlen in Punktschreibweise numerisch. Microsofts Beispiel der Sortierung nach SemVer 2.0 (von der höchsten Version zur niedrigsten):
1.0.1
1.0.1-zzz
1.0.1-rc.10
1.0.1-rc.2
1.0.1-open
1.0.1-beta
1.0.1-alpha2
1.0.1-alpha10
1.0.1-aaa
Beachten Sie: 1.0.1-alpha10 steht unter 1.0.1-alpha2, weil rein alphabetisch sortiert wird, während 1.0.1-rc.10 über 1.0.1-rc.2 steht, weil die Zahl durch einen Punkt abgetrennt ist. Microsoft rät bei Zahlen ohne Punkt zu führenden Nullen (beta01, beta05), damit die Reihenfolge stimmt; das gilt nur für dieses Schema. Merksatz: Trennen Sie die Zahl der Vorabversion mit einem Punkt: -rc.2, -rc.10.
Was ältere Clients nicht verstehen
NuGet betrachtet eine Version als spezifisch für SemVer 2.0.0, wenn das Vorabetikett durch Punkte getrennt ist (1.0.0-alpha.1) oder die Version Build-Metadaten enthält (1.0.0+githash). Ein solches Paket auf nuget.org ist für ältere Clients unsichtbar; es sehen es nur NuGet 4.3.0 oder neuer, Visual Studio 2017 ab Version 15.3 und das .NET SDK 2.0.0 oder neuer (sowie bestimmte Programme von Drittanbietern). Beim Veröffentlichen in einen eigenen Feed prüfen Sie also, welche Clients Ihre Nutzer haben.
Zwei weitere Regeln aus der Seite: nuget.org lehnt jedes Paket ohne exakte Versionsnummer ab. Und: Beim Konsumieren können Sie eine exakte Version oder einen Bereich zulässiger Versionen angeben.
Vorabversionen bei der Auflösung
NuGet entscheidet nach einer Regel, ob es Vorabversionen berücksichtigt: Verlangt das Projekt oder irgendein Paket im Graphen eine Vorabversion eines Pakets, werden stabile und Vorabversionen einbezogen, sonst nur stabile. Wählt NuGet bei verschiedenen Anforderungen, nimmt es die niedrigste Version, die alle Anforderungen erfüllt (Regel der niedrigsten anwendbaren Version). Ist das nicht möglich (zum Beispiel verlangt A genau 1.0.0 von B und C mindestens 2.0.0), meldet NuGet einen Fehler; dann soll die oberste Anwendung eine direkte Abhängigkeit auf B eintragen, denn die direkte Abhängigkeit gewinnt. Zum Fehler NU1103 sagt Microsoft: Wenn nur Vorabversionen existieren, aber eine stabile Version verlangt wird, passen Sie den Versionsbereich an, sodass Vorabversionen erlaubt sind. Und Microsoft rät bei schwebenden Versionen (floating) mit zentraler Paketverwaltung zu festen Versionen; sonst ist die Einstellung CentralPackageFloatingVersionsEnabled nötig (Fehler NU1011).