W skrócie, składnia numerów wersji Bower (i NPM) nazywa się SemVer, co jest skrótem od „Semantic Versioning”. Możesz znaleźć dokumentację dla szczegółowej składni SemVer stosowanej w Bower i NPM w API dla parsera semver w Node / npm . Możesz dowiedzieć się więcej na temat specyfikacji bazowej (która nie wspomina ~
ani innych szczegółów składni) na semver.org .
Istnieje bardzo przydatny kalkulator semver wizualny, w który można grać, dzięki czemu wszystko to jest znacznie łatwiejsze do opanowania i przetestowania.
SemVer to nie tylko składnia! Ma kilka interesujących rzeczy do powiedzenia na temat właściwych sposobów publikowania API, które pomogą zrozumieć, co oznacza składnia. Co najważniejsze:
Po zidentyfikowaniu publicznego interfejsu API komunikujesz zmiany w nim z określonymi przyrostami numeru wersji. Rozważ format wersji XYZ (Major.Minor.Patch) . Poprawki błędów, które nie wpływają na interfejs API, zwiększają wersję poprawki, dodatki / zmiany kompatybilne wstecz zwiększają wersję mniejszą, a niezgodne wstecz zmiany API zwiększają wersję główną.
Twoje szczegółowe pytanie ~
dotyczy schematu Major.Minor.Patch. (Podobnie jak powiązany operator daszka ^
). Możesz ~
zawęzić zakres wersji, które chcesz zaakceptować:
- kolejne zmiany na poziomie łaty do tej samej, mniejszej wersji ( „poprawki błędów nie wpływające na API” ) lub:
- kolejne zmiany na mniejszym poziomie do tej samej wersji głównej ( „dodatki / zmiany API kompatybilne wstecz” )
Na przykład: aby wskazać, że weźmiesz wszelkie kolejne zmiany na poziomie łatki w drzewie 1.2.x, zaczynając od 1.2.0, ale mniej niż 1.3.0, możesz użyć:
"angular": "~1.2"
or:
"angular": "~1.2.0"
Dzięki temu uzyskasz te same wyniki, co przy użyciu .x
składni:
"angular": "1.2.x"
Ale możesz użyć tyldy / ~
składni, aby być jeszcze bardziej szczegółowym: jeśli chcesz zaakceptować zmiany na poziomie łatek zaczynające się od 1.2.4 , ale wciąż mniej niż 1.3.0, użyjesz:
"angular": "~1.2.4"
Poruszanie się w lewo, w kierunku głównej wersji, jeśli używasz ...
"angular": "~1"
... jest taki sam jak ...
"angular": "1.x"
or:
"angular": "^1.0.0"
... i dopasowuje wszelkie niewielkie zmiany lub zmiany na poziomie powyżej 1.0.0 i mniej niż 2.0:
Zauważ, że ostatnia odmiana powyżej: nazywa się to „zasięgiem karetki” . Daszek wygląda okropnie podobnie >
, więc usprawiedliwiałbyś się myśleniem, że oznacza to „każdą wersję większą niż 1.0.0”. (Na pewno się w to wpakowałem.) Nie!
Zakresy karetek są używane w zasadzie do powiedzenia, że zależy Ci tylko na cyfrze najbardziej znaczącej z lewej strony - zwykle na głównej wersji - i że zezwalasz na wszelkie niewielkie zmiany na poziomie łatek, które nie wpływają na tę cyfrę najbardziej z lewej strony. Jednak w przeciwieństwie do zakresu tyldy, który określa główną wersję, zakresy karetki pozwalają określić dokładny punkt początkowy pomniejszej / łatki. A zatem ^1.0.0 === ~1
zakres karetki, taki jak ^1.2.3
pozwala powiedzieć, że weźmiesz jakiekolwiek zmiany >=1.2.3 && <2.0.0
. Nie można tego zrobić z zasięgiem tyldy.
To wszystko wydaje się na początku mylące, kiedy spojrzysz na to z bliska. Ale pomniejsz na sekundę i pomyśl o tym w ten sposób: kursor pozwala po prostu powiedzieć, że najbardziej martwisz się każdą znaczącą cyfrą, jaka pozostała najbardziej. Tylda pozwala powiedzieć, że najbardziej martwi Cię, która cyfra jest najbardziej odpowiednia. Reszta to szczegół.
To ekspresyjna siła tyldy i karety wyjaśnia, dlaczego ludzie używają ich o wiele więcej niż prostsza .x
składnia: po prostu pozwalają ci robić więcej. Dlatego zobaczysz, że tylda jest często używana, nawet tam .x
, gdzie służy. Jako przykład zobacz sam npm: własny plik package.json zawiera wiele zależności w ~2.4.0
formacie, a nie w 2.4.x
formacie, którego mógłby użyć. Trzymając się ~
, składnia jest spójna aż do listy ponad 70 wersjonowanych zależności, niezależnie od tego, który początkowy numer łaty jest dopuszczalny.
W każdym razie SemVer ma jeszcze wiele do zaoferowania, ale nie będę próbował tutaj szczegółowo tego wszystkiego opisywać. Sprawdź to w pliku Readme pakietu semver . I pamiętaj, aby korzystać z semantycznego kalkulatora wersjonowania, gdy ćwiczysz i próbujesz dowiedzieć się, jak działa SemVer.
RE: Niesekwencyjne numery wersji: Wydaje się, że ostatnie pytanie OP dotyczy określenia niesekwencyjnych numerów / zakresów wersji (jeśli dość go zredagowałem). Tak, można to zrobić, korzystając ze wspólnego podwójną rurę operator „lub”: ||
. Tak jak:
"angular": "1.2 <= 1.2.9 || >2.0.0"