Ответ 1
Смотрите документы по NPM
~version 'Approximately equivalent to version' See semver
^version 'Compatible with version' See semver
После того, как я обновил до последнего стабильного node
и npm
, я попытался npm install moment --save
. Сохраняет запись в package.json
с префиксом caret ^
. Раньше это был тильда ~
префикс.
npm
?~
и каретой ^
?Смотрите документы по NPM
~version 'Approximately equivalent to version' See semver
^version 'Compatible with version' See semver
Я также хотел бы добавить официальную документацию по npmjs, в которой описаны все методы, относящиеся к конкретным версиям, включая методы, упомянутые в вопросе.
https://docs.npmjs.com/files/package.json
https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-
~version
"Приблизительно эквивалентна версии" См. раздел npm - Tilde Ranges & semver (7)^version
"Совместимо с версией" См. npm semver - Caret Ranges & semver (7)version
должна точно соответствовать версии>version
должна быть больше версии>=version
т.д.<version
<=version
1.2.x
1.2.0, 1.2.1 и т.д., Но не 1.3.0http://sometarballurl
(это может быть URL тарбола, который будет загружен и установлен локально*
Соответствует любой версииlatest
Получает последний выпускПриведенный выше список не является исчерпывающим. Другие спецификаторы версий включают в себя URL-адреса GitHub и репозитории пользователей GitHub, локальные пути и пакеты с конкретными тегами npm.
Npm позволяет установить более новую версию пакета, чем указанная. Использование тильды (~
) дает вам исправления ошибок, а символ вставки (^
) также обеспечивает обратную совместимость новых функций.
Проблема в том, что старые версии обычно не получают исправлений ошибок, поэтому npm использует символ вставки (^
) по умолчанию для --save
.
Согласно: "Семвер объяснил - почему в моем package.json есть каретка (^)?" ,
Обратите внимание, что правила применяются к версиям выше 1.0.0, и не каждый проект следует семантическому версионированию. Для версий 0.xx каретка допускает только обновления патчей, то есть ведет себя так же, как тильда. Смотрите раздел "Кареты"
Вот наглядное объяснение понятий:
Источник: "Semantic Versioning Cheatsheet".
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
: 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
.0.2
означает 0.2 <= v < 1
. Отличается от ~
потому что: 0
Установить начальный основной уровень и разрешить обновления вверх
* or "(empty string) any version
1 v >= 1
Заморозить основной уровень
~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
Freeze patch-level
~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
Примечание: Отсутствует крупный, незначительный, патч или с указанием beta
без номера, так же, как any
пропавшего уровня.
Примечание. При установке пакета с 0
основным уровнем при обновлении будет установлена только новая версия уровня бета /pr! Это потому, что npm
устанавливает ^
по умолчанию в package.json
и когда установленная версия похожа на 0.1.3
, он замораживает все основные/второстепенные/патч-уровни.
~
фиксирует основные и младшие номера. Он используется, когда вы готовы принять исправления ошибок в своей зависимости, но не хотите никаких потенциально несовместимых изменений.
^
фиксирует только основное число. Он используется, когда вы внимательно следите за своими зависимостями и готовы быстро изменить свой код, если незначительная версия будет несовместимой.
В дополнение к этому ^
не поддерживается старыми версиями npm и следует использовать с осторожностью.
Итак, ^
является хорошим дефолтом, но он не идеален. Я предлагаю тщательно выбрать и настроить наиболее удобный для вас оператор semver.
~
: разумно закрыть до
~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. [любой]. [любой] (последняя младшая версия) ~
- 1.2. [любой] (последний патч)
Отличное чтение это сообщение в блоге о том, как semver относится к npm
и что они делают, чтобы он соответствовал стандарту semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
Совпадение шляпы может считаться "сломанным", потому что оно не обновляет ^0.1.2
до 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.
Тильда
~
замораживает старшие и младшие номера.^ Caret:
^
замораживает только основной номер.Объяснение одного лайнера
Стандартная система управления версиями - major.minor.build(например, 2.4.1)
npm проверяет и исправляет версию конкретного пакета на основе этих символов
~: исправлена основная версия, исправлена незначительная версия, соответствует любому номеру сборки
например.: ~ 2.4.1 означает, что он будет проверять на 2.4.x, где x - это что-то
^: основная версия исправлена, соответствует любой второстепенной версии, соответствует любому номеру сборки
например.: ^ 2.4.1 означает, что он проверит 2.x.x, где x - что-то
Возможно, вы видели тильду (~) и каретку (^) в package.json. В чем разница между ними?
Когда вы устанавливаете npm момент --save, он сохраняет запись в package.json с префиксом caret (^).
Проще говоря, тильда (~) соответствует самой последней младшей версии (среднее число). ~ 1.2.3 будет соответствовать всем версиям 1.2.x, но будет отсутствовать 1.3.0.
Каретка (^), с другой стороны, более расслабленная. Он обновит вас до самой последней основной версии (первый номер). ^ 1.2.3 будет соответствовать любому выпуску 1.xx, включая 1.3.0, но будет удерживаться на 2.0.0.
Ссылка: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
Тильда ~ соответствует второстепенной версии, если вы установили пакет с 1.4.2, и после установки также доступны версии 1.4.3 и 1.4.4, если в вашем package.json он используется как ~ 1.4.2, а затем npm install В вашем проекте после обновления будет установлена версия 1.4.4. Но для этого пакета доступно 1.5.0, и он не будет установлен ~. Это называется минорной версией.
Знак ^ соответствует основной версии, если пакет 1.4.2 остановлен в вашем проекте и 1.5.0 также доступен, то ^ установит основную версию. Он не позволит установить 2.1.0, если у вас есть ^ 1.4.2.
Фиксированная версия, если вы не хотите менять версию пакета при каждой установке, тогда использовали фиксированную версию без какого-либо специального символа, например, "1.4.2"
Последняя версия * Если вы хотите установить последнюю версию, используйте только * перед именем пакета.
Тильда (~)
исправлена основная версия, исправлена вспомогательная версия, соответствует любому номеру сборки
"express": "~4.13.3"
~4.13.3
означает, что он проверит 4.13.x, где x - это что-то, а 4.14.0
Карета (^)
исправлена основная версия, соответствует любой дополнительной версии, соответствует любому номеру сборки
"supertest": "^3.0.0"
^3.0.0
означает, что он проверит на 3.xx, где х что-нибудь
Номер версии в синтаксисе, который обозначает каждый раздел с различным значением. синтаксис разбит на три части, разделенные точкой.
major.minor.patch 1.0.2
Major, minor и patch представляют разные версии пакета.
npm использует тильду (~) и каретку (^), чтобы указать, какой патч и второстепенные версии использовать соответственно.
Так что, если вы видите ~ 1.0.2, это значит установить версию 1.0.2 или последнюю версию патча, такую как 1.0.4. Если вы видите ^ 1.0.2, это значит установить версию 1.0.2 или последнюю минорную версию или версию патча, такую как 1.1.0.
Карат ^
включает в себя все, что больше, чем конкретная версия в том же основном диапазоне.
тильда ~
включает все, что больше, чем конкретная версия в том же младшем диапазоне.
Например, чтобы указать допустимые диапазоны версий до 1.0.4, используйте следующий синтаксис:
Для получения дополнительной информации о синтаксическом семантическом управлении версиями см. Калькулятор nmm semver.
Больше из документации npm О семантическом управлении версиями
~ спецификации для минорных выпусков версий ^ указывает на основные выпуски версий
Например, если версия пакета 4.5.2, при обновлении ~ 4.5.2 будет установлена последняя версия 4.5.x (МЕНЬШАЯ ВЕРСИЯ) ^ 4.5.2 установит последнюю версию 4.xx (ОСНОВНАЯ ВЕРСИЯ)
Не ответ, как таковой, но наблюдение, которое, кажется, было упущено.
Описание для каратовых диапазонов:
см.: https://github.com/npm/node-semver#caret-ranges-123-025-004
Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.
Означает, что ^10.2.3
соответствует 10.2.3 <= v < 20.0.0
Я не думаю, что они имели в виду. Использование версий с 11.xx по 19.xx нарушит ваш код.
Я думаю, что они имели в виду left most non-zero number field
. В SemVer нет ничего, что требовало бы, чтобы числовые поля были однозначными.