Ответ 1
Вкратце, синтаксис для номеров версии Bower (и NPM) называется SemVer, что является сокращением для "Semantic Versioning". Вы можете найти документацию для подробного синтаксиса SemVer, используемого в Bower и NPM для API для анализатора semver, в Node/npm. Вы можете узнать больше о базовой спецификации (которая не упоминает ~
или другие подробности синтаксиса) в semver.org.
Там есть супер-удобный визуальный калькулятор semver, с которым вы можете играть, делая все это намного проще, чтобы проверить и проверить.
SemVer - это не просто синтаксис! У него есть довольно интересные вещи, чтобы сказать о правильных способах публикации API, что поможет понять, что означает синтаксис. Крайне важно:
После того, как вы идентифицируете свой общедоступный API, вы связываете с ним изменения с определенными приращениями к вашему номеру версии. Рассмотрим формат версии X.Y.Z(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". (Я, конечно, поскользнулся на этом.) Нет!
Диапазоны Caret в основном используются, чтобы сказать, что вы заботитесь только о самой левой значащей цифре - обычно основной версии, и что вы разрешаете любые изменения на уровне мажоранты или патча, которые не влияют на самый левый цифра. Тем не менее, в отличие от диапазона тильдов, который указывает основную версию, диапазоны каретки позволяют указать точную начальную точку минора/патча. Итак, пока ^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 еще больше, но я не буду пытаться подробно описать все это здесь. Проверьте это на node semver package readme. И обязательно используйте семантический калькулятор версий, пока вы практикуете и пытаетесь понять, как работает SemVer.
RE: Номера строк, не относящиеся к последовательному порядку: последний вопрос в OP состоит в том, чтобы указывать номера строк/диапазонов без последовательных версий (если я правильно их отредактировал). Да, вы можете это сделать, используя обычный двухтрубный "или" оператор: ||
. Например:
"angular": "1.2 <= 1.2.9 || >2.0.0"