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


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

"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 и т. д...

5 259

5 ответов:

в двух словах синтаксис для номеров версий Bower (и NPM) называется SemVer, что является сокращением от "семантического управления версиями". Вы можете найти документацию для подробного синтаксиса SemVer, используемого в Bower и NPM на API для парсер semver в узле / npm. Вы можете узнать больше о базовой спецификации (которая делает не отметить ~ или другие детали синтаксиса) в semver.org.

здесь супер-удобный визуальный калькулятор semver вы можете играть с, что делает все это гораздо проще Грок и тест.

SemVer-это не просто синтаксис! Он имеет некоторые довольно интересные вещи, чтобы сказать о правильных способах публикации API, которые помогут понять, что означает синтаксис. Принципиально:

как только вы идентифицируете свой публичный API, вы сообщаете ему изменения с определенными приращениями к вашему номеру версии. рассмотрим формат версии X. Y. Z (Основной.Незначительный.Патч). Исправления ошибок, не влияющие на API, увеличивают версию патча, обратно совместимые дополнения/изменения API увеличивают второстепенную версию, а обратно несовместимые изменения API увеличивают основную версию.

Итак, ваш конкретный вопрос о ~ относится к крупным.Незначительный.Схема исправления. (Как и соответствующий оператор каретки ^.) Вы можете использовать ~ сузить круг версий, которые вы готовы принять либо:

  • в последующем патч-уровень изменения в той же минорной версии ( "исправлены ошибки, не влияющие на 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:

обратите внимание, что последний вариант выше: это называется 'диапазон каре'. Каретка очень похожа на >, так что вы будете извинены за то, что думаете, что это означает " любая версия больше 1.0.0". (Я, конечно, поскользнулся на этом.) Нет!

диапазоны каретки в основном используются, чтобы сказать, что вы заботитесь только о самая левая значащая цифра-обычно основная версия - и что вы разрешите любые незначительные изменения или изменения на уровне патча, которые не влияют на эту самую левую цифру. Тем не менее, в отличие от диапазона Тильды, который определяет основную версию, диапазоны каретки позволяют указать точную начальную точку minor/patch. Так, в то время как ^1.0.0 === ~1, диапазон каретки, например ^1.2.3 позволяет сказать, что вы будете принимать любые изменения >=1.2.3 && <2.0.0. Вы не могли бы сделать это с диапазоном Тильды.

это все кажется запутанным на первый взгляд, когда вы смотрите на это-близко. Но уменьшите масштаб на секунду, и подумайте об этом так: каретка просто позволяет вам сказать, что вы больше всего обеспокоены тем, что значащая цифра остается самой большой. Тильда позволяет вам сказать, что вы больше всего беспокоитесь о том, какая цифра самая правильная. остальное-мелочи.

это выразительная сила Тильды и каре, что объясняет, почему люди используют их гораздо больше, чем просто .x синтаксис: они просто позволяют делать больше. Вот почему вы увидите, что Тильда часто используется даже там, где .x будет служить. В качестве примера см. Сам НПМ: его собственный пакет.JSON файл включает в себя множество зависимостей в , а не это может использовать. Придерживаясь ~, синтаксис согласован полностью вниз по списку 70 + версионных зависимостей, независимо от того, какой начальный номер патча является приемлемым.

в любом случае, есть еще что-то для SemVer, но я не буду пытаться подробно все это здесь. Проверьте это на узел semver пакета readme. И обязательно используйте семантический калькулятор версий в то время как вы практикуете и пытаетесь понять, как работает SemVer.


RE: номера не последовательных версий: последний вопрос OP, похоже, касается указания не последовательных номеров версий/диапазонов (если я его отредактировал справедливо). Да, вы можете сделать это, используя общий оператор двойной трубы "или":||. Вот так:

"angular": "1.2 <= 1.2.9 || >2.0.0"

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

  • Дефис Диапазоны Х. Ю. З. - Б. А. С. 1.2.3-2.3.4 Указывает >=1.2.3

  • 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
    • ^0.0.x (средства >=0.0.0
    • ^0.0 (средства >=0.0.0

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

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

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

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

$ bower install "jquery#<2.0 >1.10"

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

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

если нет номера патча, ~ эквивалентно добавлению .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.9. Также "angular": "~1" и "angular": "~1.0" are не эквивалентны. Этот можно проверить с помощью npm semver calculator.