Что такое синтаксис версии 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, etc...

5 ответов


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

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

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

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

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

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

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

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

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

в любом случае, там еще SemVer, но я не буду пытаться подробно все это здесь. Проверьте это на readme пакета Node semver. И обязательно используйте калькулятор семантического управления версиями пока вы практикуете и пытаетесь понять, как работает 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

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

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

$ bower install jquery#1.11.1

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

$ bower install jquery#~1.11

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

$ bower install "jquery#<2.0 >1.10"

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

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

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

~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 калькулятор.