Что такое синтаксис версии bower (и npm)?

Bower позволяет мне указывать требования к версии для пакетов, используя следующий синтаксис:

"dependencies": {
  "<name>": "<version>",
},

Но я не смог найти, какой синтаксис использовать для <version>. Я знаю, что я могу указать версии:

  • больше определенной версии с ">1.0.0"
  • больше или равно версии: ">=1.0.0"
  • или в некотором диапазоне: "1.0.0 - 2.0.0".

Я также знаю, что существует общий синтаксис версии, содержащий тильду: "~1.0.0". Но я не уверен, что это значит и является ли он таким же, как "=1.0.0".

Мне также интересно узнать, могу ли я указать несколько непоследовательных версий, например, точно 1.0.3 плюс версии больше, чем 1.5.0 и т.д.

Ответ 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"

Ответ 2

На основе semver вы можете использовать

  • Гибкие диапазоны X.Y.Z - A.B.C 1.2.3-2.3.4 Указывает >= 1.2.3 <= 2.3.4

  • X-Изменяется 1.2.x 1.X 1.2.*

  • Диапазоны тильдов ~1.2.3 ~1.2 Указывает на изменение изменений на уровне патча или незначительные изменения версии.

  • Диапазоны шкалы ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    Позволяет изменять изменения, которые не изменяют левую самую ненулевую цифру в корневом каталоге [major, minor, patch]

    • ^1.2.x (означает >= 1.2.0 и 2.0.0)
    • ^0.0.x (означает >= 0.0.0 < 0.1.0)
    • ^0.0 (означает >= 0.0.0 < 0.1.0)

Ответ 3

Bower использует синтаксис semver, но вот несколько быстрых примеров:

Вы можете установить определенную версию:

$ bower install jquery#1.11.1

Вы можете использовать ~ для указания "любой версии, которая начинается с этого":

$ bower install jquery#~1.11

Вы можете указать несколько требований к версии вместе:

$ bower install "jquery#<2.0 >1.10"

Ответ 4

Вы также можете использовать ключевое слово latest для установки последней доступной версии:

  "dependencies": {
    "fontawesome": "latest"
  }

Ответ 5

Если номер патча отсутствует, ~ эквивалентно добавлению .x к версии без тильды. Если номер патча, ~ разрешает все номера патчей >= указанный.

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

У меня недостаточно очков, чтобы прокомментировать принятый ответ, но некоторые данные тильды не согласуются с документацией связанного semver: "angular": "~1.2" будет не соответствовать 1.3, 1.4, 1.4 +0,9. Также "angular": "~1" и "angular": "~1.0" эквивалентны не. Это можно проверить с помощью калькулятора npm semver.