W tym artykule
Czym jest wersjonowanie semantyczne?
Semantyczne wersjonowanie (SemVer) to schemat wersjonowania, który przypisuje znaczenie każdej części numeru wersji. Stworzony przez Toma Prestona-Wernera, SemVer zapewnia uniwersalną konwencję komunikowania natury i wpływu zmian oprogramowania wyłącznie przez numery wersji.
Przestrzegając SemVer, deweloperzy i użytkownicy mogą natychmiast zrozumieć, czy aktualizacja wprowadza zmiany niekompatybilne wstecz, nowe funkcje czy poprawki błędów — jedynie czytając numer wersji. Ta przewidywalność jest kluczowa dla zarządzania zależnościami we współczesnych ekosystemach oprogramowania.
Format SemVer
Semantyczna wersja składa się z trzech komponentów numerycznych oddzielonych kropkami: MAJOR.MINOR.PATCH.
- MAJOR — zwiększany przy niekompatybilnych zmianach API. Przejście z 1.x.x do 2.0.0 sygnalizuje, że istniejący kod może przestać działać
- MINOR — zwiększany przy dodawaniu funkcjonalności w sposób wstecznie zgodny. Przejście z 1.2.x do 1.3.0 oznacza nowe funkcje bez łamania istniejących
- PATCH — zwiększany przy wstecznie zgodnych poprawkach błędów. Przejście z 1.2.3 do 1.2.4 oznacza, że naprawiono tylko błędy
- Każdy komponent musi być nieujemną liczbą całkowitą i nie może zawierać zer wiodących (1.02.3 jest nieprawidłowe)
Wypróbuj za darmo — bez rejestracji
Zwaliduj wersje SemVer →Zakresy wersji
Menedżery pakietów używają zakresów wersji do określania zgodnych wersji zależności. Zrozumienie tych zakresów jest niezbędne dla niezawodnych kompilacji.
- Zakresy daszka (^1.2.3) — pozwalają na zmiany, które nie modyfikują najbardziej lewej niezerowej cyfry. ^1.2.3 oznacza dowolną wersję od 1.2.3 do, ale nie włącznie z 2.0.0
- Zakresy tyldy (~1.2.3) — pozwalają tylko na zmiany poziomu patch. ~1.2.3 oznacza dowolną wersję od 1.2.3 do, ale nie włącznie z 1.3.0
- Dokładna wersja (1.2.3) — tylko ta konkretna wersja jest akceptowalna, brak elastyczności
Zastosowania
Semantyczne wersjonowanie jest fundamentem nowoczesnego zarządzania pakietami i przepływów pracy wydań.
- npm, pip i Cargo — menedżery pakietów polegają na SemVer do rozwiązywania drzew zależności i zapobiegania docieraniu zmian niekompatybilnych wstecz do produkcji
- Potoki CI/CD — zautomatyzowane systemy używają tagów SemVer do wyzwalania kompilacji, publikowania wydań i generowania dzienników zmian
- Wersjonowanie API — REST API używa głównych wersji w URL-ach (v1, v2) do utrzymania wstecznej zgodności podczas ewolucji
- Autorzy bibliotek — publikowanie biblioteki z właściwym SemVer sygnalizuje konsumentom, kiedy aktualizacje są bezpieczne
Pre-release i metadane
SemVer obsługuje dwa opcjonalne rozszerzenia, które dodają kontekst do numerów wersji bez wpływu na reguły pierwszeństwa.
- Identyfikatory pre-release — dołączane po myślniku: 1.0.0-alpha, 1.0.0-beta.2, 1.0.0-rc.1. Wskazują wersje, które nie są jeszcze stabilne i mają niższy priorytet niż powiązane wydanie
- Metadane kompilacji — dołączane po znaku plus: 1.0.0+build.123, 1.0.0-beta+exp.sha.5114f85. Metadane kompilacji są ignorowane przy określaniu pierwszeństwa wersji
- Wersje pre-release są sortowane przy użyciu identyfikatorów oddzielonych kropkami: identyfikatory numeryczne sortują numerycznie, identyfikatory alfanumeryczne sortują leksykalnie
FAQ
Czy 0.x.x jest traktowane inaczej niż 1.x.x?
Tak. W SemVer wersja 0.x.x wskazuje na wstępny rozwój, gdzie wszystko może się zmienić w dowolnym momencie. Publiczne API nie powinno być uważane za stabilne. Po wydaniu 1.0.0 zobowiązujesz się do przestrzegania reguł SemVer dla wszystkich kolejnych wydań.
Czy mogę używać v jako prefiksu (v1.2.3)?
Specyfikacja SemVer nie zawiera prefiksu v — kanoniczny format to 1.2.3. Jednak wiele narzędzi (tagi Git, wydania GitHub) konwencjonalnie używa v1.2.3. Większość walidatorów akceptuje oba formaty.
Co się stanie, jeśli zapomnę zwiększyć wersję major dla zmiany niekompatybilnej wstecz?
Konsumenci korzystający z zakresów daszka automatycznie otrzymają aktualizację, a ich kompilacje mogą nieoczekiwanie przestać działać. Dlatego dyscyplina SemVer jest krytyczna — to kontrakt społeczny między autorami bibliotek a konsumentami.