Что такое синтаксис версии 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.3X-Диапазоны
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 калькулятор.