У двох словах, синтаксис номерів версій Bower (і NPM) називається SemVer, що скорочується як "Semantic Versioning". Ви можете знайти документацію для детального синтаксису SemVer, який використовується в Bower та NPM, в API для синтаксичного аналізатора в межах Node / npm . Ви можете дізнатися більше про базову специфікацію (яка не згадує ~
та інші деталі синтаксису) на semver.org .
Існує надзвичайно зручний візуальний калькулятор semver, з яким ви можете грати, що робить все це набагато простішим для того, щоб пограбувати та перевірити.
SemVer - це не просто синтаксис! Є кілька цікавих речей про правильні способи публікації API, що допоможе зрозуміти, що означає синтаксис. Принципово важливо:
Після того, як ви ідентифікуєте свій загальнодоступний API, ви повідомляєте про нього зміни з певними кроками до номера своєї версії. Розглянемо формат версії XYZ (Major.Minor.Patch) . Виправлення помилок, які не впливають на приріст API версії патча, додатково сумісні додатки API / зміни, збільшуючи незначну версію, і назад несумісні зміни API збільшують основну версію.
Отже, ваше конкретне питання щодо ~
стосується цієї схеми Major.Minor.Patch. (Як і пов'язаний оператор карет ^
.) Ви можете використовувати ~
для звуження діапазону версій, які ви готові прийняти:
- наступні зміни на рівні патчу на ту ж незначну версію ( "виправлення помилок, що не впливають на API" ), або:
- наступні незначні зміни на тій же основній версії ( "назад / сумісні доповнення / зміни API" )
Наприклад: щоб вказати, що ви будете приймати будь-які наступні зміни рівня патчу на дереві 1.2.x, починаючи з 1.2.0, але менше 1.3.0, ви можете використовувати:
"angular": "~1.2"
or:
"angular": "~1.2.0"
Це також отримує ті самі результати, що і за допомогою .x
синтаксису:
"angular": "1.2.x"
Але ви можете використовувати ~
синтаксис tilde / синтаксису, щоб бути ще більш конкретним: якщо ви готові прийняти зміни лише на рівні патчу, починаючи з 1.2.4 , але все ще менше 1.3.0, ви будете використовувати:
"angular": "~1.2.4"
Рухаючи вліво, до основної версії, якщо ви використовуєте ...
"angular": "~1"
... це те саме, що ...
"angular": "1.x"
or:
"angular": "^1.0.0"
... і відповідає будь-яким незначним змінам або змінам на рівні патчу вище 1,0,0 і менше 2,0:
Зауважте, що остання версія вище: вона називається "діапазон карет" . Карета виглядає жахливо багато як >
, так що ви б вибачили, думаючи, що це означає "будь-яка версія, що перевищує 1,0,0". (Я, звичайно, прослизнув на цьому.) Ні!
Діапазони карет в основному використовуються для того, щоб говорити про те, що ви дбаєте лише про найзначнішу ліву цифру - як правило, про основну версію - і що ви допускаєте будь-які зміни на рівні другого або латки, які не впливають на цю найбільшу ліву цифру. Однак, на відміну від діапазону тильди, який визначає основну версію, діапазони карет дозволяють вказати точну початкову точку другорядного / виправлення. Тож, ^1.0.0 === ~1
діапазон карет, наприклад, ^1.2.3
дозволяє сказати, що ви вживатимете будь-які зміни >=1.2.3 && <2.0.0
. З діапазоном тильда ви цього не могли зробити.
Це спочатку здається заплутаним, коли ви дивитесь на це близько. Але зменшіть на секунду і подумайте про це так: карета просто дозволяє вам сказати, що вас найбільше турбує те, що залишається найбільш значущою цифрою. Тильда дозволяє вам сказати, що вас найбільше турбує той, який цифр є найбільш правильним. Решта - деталі.
Саме виразна сила тильди і карета пояснюють, чому люди використовують їх набагато більше, ніж простіший .x
синтаксис: вони просто дозволяють робити більше. Ось чому ви побачите тильду, яку часто використовують, навіть там, де вона .x
буде служити. Як приклад, див. Сам npm: його власний файл package.json включає багато залежностей у ~2.4.0
форматі, а не 2.4.x
формат, який він може використовувати. Дотримуючись ~
, синтаксис узгоджується на весь перелік залежностей від 70+, незалежно від того, який початковий номер виправлення є прийнятним.
У всякому разі, у SemVer є ще багато, але я не намагатимусь тут все це деталізувати. Перевірте це в режимі readme пакета вузла . І не забудьте використовувати калькулятор семантичної версії, коли ви тренуєтесь і намагаєтесь навчитись, як працює SemVer.
RE: Непослідовні номери версій: Кінцеве питання ОП, схоже, стосується конкретизації номерів / діапазонів непослідовних версій (якщо я це правильно відредагував). Так, ви можете зробити це, використовуючи загальну подвійну трубу «або» оператор: ||
. Так:
"angular": "1.2 <= 1.2.9 || >2.0.0"