В двух словах, синтаксис номеров версий Bower (и NPM) называется SemVer, что сокращенно от Semantic Versioning. Вы можете найти документацию для подробного синтаксиса SemVer, который используется в Bower и NPM в API для анализатора semver в Node / npm . Вы можете узнать больше о базовой спецификации (которая не упоминает ~
или другие детали синтаксиса) на semver.org .
Есть супер-удобный визуальный калькулятор с семивром, с которым вы можете играть, что делает все это гораздо проще в поиске и тестировании.
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"
Но вы можете использовать тильду / ~
синтаксис, чтобы быть еще более конкретным: если вы готовы принимать изменения уровня патча, начиная с 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:
Обратите внимание, что последний вариант выше: он называется «диапазон каретки» . Каретка очень похожа на a >
, так что вы будете извинены за то, что думаете, что это означает «любая версия больше 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 узла . И обязательно используйте калькулятор семантического контроля версий, пока вы тренируетесь и пытаетесь понять, как работает SemVer.
RE: Номера последовательных версий: последний вопрос OP, по-видимому, касается указания непоследовательных номеров / диапазонов версий (если я отредактировал их справедливо). Да, вы можете сделать это, используя общую двойную трубу «или» оператор: ||
. Вот так:
"angular": "1.2 <= 1.2.9 || >2.0.0"