Opierając się na moim doświadczeniu ze złożonym zarządzaniem zależnościami na poziomie platformy korporacyjnej i wersjonowaniem wydań, polecam podejście, które lubię nazywać wersjonowaniem półsemantycznym .
Zasadniczo opiera się na Semantic Versioning 2.0 ale nie jest tak rygorystyczny.
Segmenty wersji semantycznej:
<primary.release.segment>[-<pre.release.segment>][+<post.release.segment>]
Format segmentu wydania podstawowego:
MARKETTING.MAJOR.MINOR.PATCH
Każdy segment powinien zezwalać na znaki alfanumeryczne, ale w przypadku logicznych zmian przyrostowych zalecane są czyste cyfry.
Podobnie jak SemVer, polecam komponenty Major, Minor i Patch, aby reprezentowały warstwy kompatybilności wstecznej, ale zalecam również dodanie komponentu Marketingowego . Dzięki temu właściciele produktów, epiki / grupy funkcji i obawy biznesowe mogą zderzyć się z głównym komponentem niezależnie od kwestii zgodności technicznej.
W przeciwieństwie do innych odpowiedzi, nie polecam dołączania numeru kompilacji do segmentu podstawowego. Zamiast tego dodaj segment po wydaniu po znaku „+” (np. 1.1.0.0 + build.42). SemVer nazywa to metadanymi kompilacji, ale myślę, że segment po wydaniu jest bardziej przejrzysty. Ten segment doskonale nadaje się do deklarowania danych sufiksu jako niezwiązanych z informacjami o zgodności w podstawowym segmencie wydania. Do kompilacji z ciągłą integracją można wtedy nadać poprzedni numer wersji z przyrostowym numerem kompilacji, który resetuje się po każdej wersji podstawowej (np .: 1.1.0.0 -> 1.1.0.0 + build.1 -> 1.1.0.0 + build.2 -> 1.1.0.1). Niektórzy na przemian lubią umieszczać tutaj numer wersji svn lub git commit sha, aby ułatwić powiązanie z repozytorium kodu. Inną opcją jest użycie segmentu po wydaniu dla poprawek i poprawek, chociaż warto rozważyć dodanie w tym celu nowego podstawowego składnika wydania. Zawsze może zostać usunięty, gdy składnik poprawki jest zwiększany, ponieważ wersje są skutecznie wyrównane do lewej i posortowane.
Oprócz segmentów wydań i post-release, ludzie często chcą używać segmentu przedpremierowego, aby wskazać prawie stabilne wersje wstępne, takie jak alfa, beta i kandydaci do wydania. Podejście SemVer działa dobrze, ale zalecam oddzielanie składników numerycznych od klasyfikatorów alfanumerycznych (np .: 1.2.0.0 + alpha.2 lub 1.2.0.0 + RC.2). Zwykle należy podbić segment wydania w tym samym czasie, co dodanie segmentu po wydaniu, a następnie upuścić segment przedpremierowy, gdy następnym razem podbijesz segment wersji podstawowej (np .: 1.0.1.2 -> 1.2.0.0-RC.1 - > 1.2.0.0). Segmenty przedpremierowe są dodawane, aby wskazać, że nadchodzi nowa wersja, zwykle jest to tylko ustalony zestaw funkcji do bardziej dogłębnego testowania i udostępniania, który nie zmienia się z minuty na minutę w oparciu o więcej zatwierdzeń.
Piękno posiadania tego wszystkiego semantycznie zdefiniowanego w sposób, który obejmuje prawie wszystkie przypadki użycia, polega na tym, że można je analizować, sortować, porównywać i zwiększać w standardowy sposób. Jest to szczególnie ważne w przypadku używania systemów CI do złożonych aplikacji z wieloma małymi niezależnie wersjonowanymi komponentami (takimi jak mikrousługi), z których każdy ma własne zarządzane zależności.
Jeśli jesteś zainteresowany, napisałem parser semantyczny w języku ruby . Musiałem nie tylko używać tego wzorca, ale móc zarządzać innymi aplikacjami, które go używały.