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
, и т. Д ...
node.js
bower
semantic-versioning
Самуэль Хапак
источник
источник
Ответы:
В двух словах, синтаксис номеров версий Bower (и NPM) называется SemVer, что сокращенно от Semantic Versioning. Вы можете найти документацию для подробного синтаксиса SemVer, который используется в Bower и NPM в API для анализатора semver в Node / npm . Вы можете узнать больше о базовой спецификации (которая не упоминает
~
или другие детали синтаксиса) на semver.org .Есть супер-удобный визуальный калькулятор с семивром, с которым вы можете играть, что делает все это гораздо проще в поиске и тестировании.
SemVer - это не просто синтаксис! Здесь есть несколько интересных вещей о правильных способах публикации API, которые помогут понять, что означает синтаксис. Кардинально:
Итак, ваш конкретный вопрос
~
касается этой схемы Major.Minor.Patch. (Как и соответствующий оператор каретки^
.) Вы можете использовать~
для сужения диапазона версий, которые вы готовы принять:Например: чтобы указать, что вы будете принимать любые последующие изменения уровня патча в дереве 1.2.x, начиная с 1.2.0, но менее 1.3.0, вы можете использовать:
Это также дает вам те же результаты, что и при использовании
.x
синтаксиса:Но вы можете использовать тильду /
~
синтаксис, чтобы быть еще более конкретным: если вы готовы принимать изменения уровня патча, начиная с 1.2.4 , но все еще менее 1.3.0, вы должны использовать:Двигаясь влево, к основной версии, если вы используете ...
... это так же, как ...
... и соответствует любым незначительным изменениям или изменениям уровня исправлений выше 1.0.0 и ниже 2.0:
Обратите внимание, что последний вариант выше: он называется «диапазон каретки» . Каретка очень похожа на a
>
, так что вы будете извинены за то, что думаете, что это означает «любая версия больше 1.0.0». (Я, конечно, поскользнулся на этом.) Нет!Диапазоны каретки в основном используются, чтобы сказать, что вы заботитесь только о самой левой значащей цифре - обычно основной версии - и что вы разрешите любые незначительные изменения или изменения уровня патча, которые не затрагивают эту самую левую цифру. Тем не менее, в отличие от диапазона тильды, в котором указана основная версия, диапазоны каретки позволяют указать точную начальную точку вспомогательного / патча. Таким образом,
^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 есть еще кое-что, но я не буду пытаться описывать все это здесь. Проверьте это в readme пакета semver узла . И обязательно используйте калькулятор семантического контроля версий, пока вы тренируетесь и пытаетесь понять, как работает SemVer.
RE: Номера последовательных версий: последний вопрос OP, по-видимому, касается указания непоследовательных номеров / диапазонов версий (если я отредактировал их справедливо). Да, вы можете сделать это, используя общую двойную трубу «или» оператор:
||
. Вот так:источник
~
в частности, означает, что номер патча (третьего) может быть больше указанного, например~1.2.3
, эквивалентен>=1.2.3 <1.3.0
.'1.1.x' === '>=1.1.0' === '~1.1.0'
. Случай 1.1.0 прост. Но x-нотация не может быть гранулированной, как может'>=1.1.4'
или'~1.1.4'
. Итак, вы попадаете'1.1.x'
в одно место в вашем списке зависимостей и'~2.7.3'
в другое место. Это нормально, и работает, но разработчик должен проанализировать несколько синтаксисов, чтобы прочитать один список. И, если вы пишете пакеты для программной установки версии, вам нужен единый синтаксис. И большинство людей хотят предотвратить серьезные изменения. Следовательно, все проблемы решены с~
.Основываясь на semver , вы можете использовать
Диапазоны дефиса XYZ - ABC
1.2.3-2.3.4
Указывает > = 1.2.3 <= 2.3.4X-диапазонов
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)источник
Бауэр использует синтаксис semver , но вот несколько быстрых примеров:
Вы можете установить конкретную версию:
Вы можете использовать ~, чтобы указать «любую версию, которая начинается с этой»:
Вы можете указать несколько требований к версии вместе:
источник
Вы также можете использовать
latest
ключевое слово для установки самой последней версии:источник
"*" := >=0.0.0
(любая версия удовлетворяет)", что близко, но немного расплывчато, так как оно не говорит конкретно о последних, так что это может быть первым, что он найдет?Если номер патча отсутствует,
~
это эквивалентно добавлению.x
к версии без тильды. Если есть номер патча,~
разрешает все номера патчей> = указанный.У меня недостаточно баллов, чтобы комментировать принятый ответ, но некоторая информация тильды расходится с документацией, связанной с semver: не
"angular": "~1.2"
будет соответствовать 1.3, 1.4, 1.4.9. Кроме того, и это не эквивалентны. Это можно проверить с помощью калькулятора npm semver ."angular": "~1"
"angular": "~1.0"
источник