В чем разница между Тильдой(~) и кареткой(^) в упаковке.в JSON?
после того, как я обновился до последней стабильной node
и npm
, Я пробовал npm install moment --save
. Он сохраняет запись в package.json
С caret(^)
префикс. Раньше это было tilde(~)
префикс.
- почему эти изменения в
npm
? - в чем разница между
tilde(~)
иcaret(^)
? - каковы преимущества перед другими?
14 ответов
проще говоря, Тильда соответствует самой последней минорной версии (среднее число). ~1.2.3 будет соответствовать всем 1.2.х версии, но будет Мисс 1.3.0.
каретка, с другой стороны, более расслаблена. Он обновит вас до самая последняя основная версия (первый номер). ^1.2.3 будет соответствовать любой 1.X. X релиз в том числе 1.3.0, но будет держаться 2.0.0.
http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/
обратите внимание, что терминология автора несколько вводит в заблуждение: когда он говорит" самая последняя минорная версия "для~, он означает" самая последняя патч версия в указанной версии". Аналогично для^, "самая последняя основная версия "должна читаться как" самая последняя несовершеннолетний версия в указанной основной версии".
Я хотел бы добавить официальную документацию npmjs, которая описывает все методы для специфики версии, включая те, которые упомянуты в вопросе -
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
-
~version
"приблизительно эквивалентно версии" см. npm semver - Тильда диапазоны & semver (7) -
^version
"совместимость с версией" см. npm semver - Caret диапазоны & semver (7) -
version
должен соответствовать версии точно -
>version
должно быть больше, чем версия -
>=version
etc <version
<=version
-
1.2.x
1.2.0, 1.2.1, etc. но не 1.3.0 -
http://sometarballurl
(это может быть URL-адрес tarball, который будет загружен и установлено локально -
*
соответствует любой версии -
latest
получение последней версии
приведенный выше список не является исчерпывающим. Другие спецификаторы версий включают URL-адреса GitHub и репозитории пользователей GitHub, локальные пути и пакеты с определенными тегами npm
Npm позволяет устанавливать более новую версию пакета, чем указанная. Использование Тильды (~
) дает вам выпуски исправлений ошибок и каретку (^
) дает вам обратно совместимые новые функции, а также.
проблема в том, что старые версии обычно не получают исправлений ошибок, поэтому npm использует caret (^
) по умолчанию для --save
.
по: "Semver объяснил - почему каре (^) в моем пакет.в JSON?".
Примечание что правила применяются к версиям выше 1.0.0, и не каждый проект следует семантическому управлению версиями. Для версий 0.X. X каретка позволяет только патч обновлений, т. е. он ведет себя так же, как Тильда. См."Каре Колеблется"
вот визуальное объяснение понятий:
~
исправлены крупные и мелкие цифры. Он используется, когда вы готовы принять исправления ошибок в вашей зависимости, но не хотите каких-либо потенциально несовместимых изменений.
^
исправляет только основное число. Он используется, когда вы внимательно следите за своими зависимостями и готовы быстро изменить свой код, если незначительный выпуск будет несовместим.
кроме того, ^
is не поддерживается старыми версиями npm и должны использоваться с осторожность.
и ^
- хорошее значение по умолчанию, но оно не идеально. Предлагаю тщательно подобрать и настроить наиболее полезный для вас оператор semver.
Semver
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
- использовать npm semver калькулятор для тестирования. (Хотя объяснения ^ (включают все больше, чем определенная версия в том же основном диапазоне) и ~ (включают все больше, чем определенная версия в том же незначительном диапазоне) не являются 100% правильными, калькулятор, кажется, работает нормально)
- можно использовать SemVer Проверки вместо этого, который не требует, чтобы вы выбрали пакет, а также предлагает объяснения.
разрешить или запретить изменения
- версия Pin:
1.2.3
. - использовать
^
(как руководитель). Позволяет обновлять на втором ненулевом уровне слева:^0.2.3
означает0.2.3 <= v < 0.3
. - использовать
~
(как хвост). Как правило, заморозить право-самый уровень или установить ноль, если опущено:-
~1
означает1.0.0 <= v < 2.0.0
-
~1.2
означает1.2.0 <= v < 1.3.0
. -
~1.2.4
означает1.2.4 <= v < 1.3.0
.
-
- Ommit правый-самый уровень:
0.2
означает0.2 <= v < 1
. Отличается от~
потому что:- начиная опущенную версию уровня всегда
0
- вы можете установить начальную основную версию без указания подуровней.
- начиная опущенную версию уровня всегда
все (надеюсь) возможности
установить стартовый основной уровень и разрешить обновления вверх
* or "" (empty string) any version
1 v >= 1
заморозить major-level
~0 (0) 0.0 <= v < 1
0.2 0.2 <= v < 1 // Can't do that with ^ or ~
~1 (1, ^1) 1 <= v < 2
^1.2 1.2 <= v < 2
^1.2.3 1.2.3 <= v < 2
^1.2.3-beta.4 1.2.3-beta.4 <= v < 2
заморозить младший уровень
^0.0 (0.0) 0 <= v < 0.1
~0.2 0.2 <= v < 0.3
~1.2 1.2 <= v < 1.3
~0.2.3 (^0.2.3) 0.2.3 <= v < 0.3
~1.2.3 1.2.3 <= v < 1.3
патч-уровень заморозки
~1.2.3-beta.4 1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta 0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4 0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)
запретить обновления
1.2.3 1.2.3
^0.0.3 (0.0.3) 0.0.3
обратите внимание: отсутствует major, minor, патч или указание beta
без номера, это то же самое, что any
для недостающего уровня.
обратите внимание: при установке пакета, который имеет 0
в качестве основного уровня, обновление будет устанавливать только новую версию уровня beta / pr! Это потому что npm
наборы ^
по умолчанию в package.json
и когда установленная версия вроде 0.1.3
, он замораживает все уровни major / minor / patch.
~
: разумно закрыть to
~1.1.5: 1.1.0 <= accepted < 1.2.0
^
: совместимость С
^1.1.5: 1.1.5 <= accepted < 2.0.0
^0.1.3: 0.1.3 <= accepted < 0.2.0
^0.0.4: 0.0.4 <= accepted < 0.1.0
^
Это 1.[любой.][any] (последняя минорная версия)~
- это 1.2.[любой] (последний патч)
отличное чтение этот блог о том, как semver применяется к npm
и что они делают, чтобы это соответствовало стандарт semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
Hat matching можно считать "сломанным", потому что он не будет обновлять ^0.1.2
to 0.2.0
. Когда программное обеспечение появляется использовать 0.x.y
версии и сопоставление шляпы будут соответствовать только последней переменной цифре (y
). Это делается нарочно. Причина в том, что в то время как программное обеспечение развивается, API быстро меняется: в один день у вас есть эти методы, а на другой день у вас есть эти методы, и старые исчезли. Если вы не хотите нарушать код для людей, которые уже используют вашу библиотеку вы идете и увеличиваете основную версию: например 1.0.0
->2.0.0
->3.0.0
. Таким образом, к тому времени, когда ваше программное обеспечение, наконец, 100% сделано и полнофункциональный это будет как версия 11.0.0
и это не выглядит очень значимым, и на самом деле выглядит запутанным. Если бы вы, с другой стороны, использовали 0.1.x
->0.2.x
->0.3.x
версии, то к тому времени программное обеспечение, наконец, 100% сделано и полнофункциональный он выпущен как версия 1.0.0
и это означает ,что " этот выпуск является долгосрочным сервисом, вы можете продолжайте и используйте эту версию библиотеки в своем производственном коде, и автор не изменит все завтра или в следующем месяце, и он не откажется от пакета".
правила: используйте 0.x.y
управление версиями, когда ваше программное обеспечение еще не созрело, и отпустите его с увеличением средней цифры при изменении вашего публичного API (поэтому люди, имеющие ^0.1.0
не будет 0.2.0
обновить и это не нарушит их код). Затем, когда программное обеспечение созреет, отпустите его под 1.0.0
и увеличивайте самую левую цифру каждый раз, когда ваш публичный API изменяется (поэтому люди, имеющие ^1.0.0
не будет 2.0.0
обновить и это не нарушит их код).
Given a version number MAJOR.MINOR.PATCH, increment the:
MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.
одно объяснение лайнера
стандартная система управления версиями является основной.незначительный.build (например, 2.4.1)
npm проверяет и исправляет версию конкретного пакета на основе этих символов
~: основная версия исправлена, минорная версия исправлена, соответствует любому номеру сборки
например : ~2.4.1 означает, что он будет проверять 2.4.x, где x-что угодно
^: основная версия исправлена, соответствует любой минорной версии, соответствует любому номеру сборки
например : ^2.4.1 означает, что он будет проверять 2.X. x, где x-что угодно
~ Тильда:
-
~
исправления основные и второстепенные номера. - он используется, когда вы готовы принять исправления ошибок в вашей зависимости, но не хочу никаких потенциально несовместимых изменений.
- Тильда соответствует последние версии (средний ряд).
- ~1.2.3 будет соответствовать всем 1.2.X версии, но он пропустит 1.3.0.
- Тильда ( ~ ) дает вам исправление ошибок релизы
^ Caret:
-
^
исправляет только основное число. - он используется, когда вы внимательно следите за своими зависимостями и готовы быстро изменить свой код, если незначительный выпуск будет несовместим.
- он обновит вас до самая последняя основная версия (первое число).
- ^1.2.3 будет соответствовать 1.х.релиз X в том числе 1.3.0, но это отложим на 2.0.0.
- Caret ( ^ ) дает вам обратно совместимые новые функции, а также.
Тильда (~)
основная версия исправлена, минорная версия исправлена, соответствует любой сборке номер
"express": "~4.13.3"
~4.13.3
означает, что он будет проверять 4.13.x где x-что угодно и 4.14.0
Caret (^)
основная версия исправлена, соответствует любой минорной версии, соответствует любой сборке номер
"supertest": "^3.0.0"
^3.0.0
означает, что он будет проверять 3.х.X, где X ничего
вы, вероятно, видели тильду ( ~ ) и каретку ( ^ ) в пакете.формат JSON. В чем разница между ними?
когда вы делаете npm install moment -- save, он сохраняет запись в пакете.json с префиксом caret ( ^ ).
Тильда (~)
проще говоря, Тильда ( ~ ) соответствует самой последней минорной версии (среднее число). ~1.2.3 будет соответствовать всем 1.2.X версии, но пропустит 1.3.0.
каре (^)
в карет ( ^ ), с другой стороны, более расслаблен. Он обновит вас до последней основной версии (первый номер). ^1.2.3 будет соответствовать 1.х.релиз X в том числе 1.3.0, но отложим на 2.0.0.
ссылка:https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
номер версии находится в синтаксисе, который обозначает каждый раздел с различным значением. синтаксис разбит на три части, разделенные точкой.
майора.незначительный.заплатка 1.0.2
Major, minor и patch представляют различные версии пакета.
npm использует тильду ( ~ ) и каретку ( ^ ), чтобы указать, какие патч и минорные версии использовать соответственно.
Итак, если вы видите ~1.0.2, это означает установить версию 1.0.2 или последний патч версии 1.0.4. Если вы видите ^1.0.2, это означает установить версию 1.0.2 или последнюю версию minor или patch, такую как 1.1.0.
~ specfices для незначительных версий ^ указывает на выпуски основных версий
например, если версия пакета 4.5.2, при обновлении ~4.5.2 установит последнюю версию 4.5.X версия (минорная версия) ^4.5.2 установит последнюю версию 4.X. X версия (основная версия)