В чем разница между тильдой (~) и кареткой (^) в package.json?
После того, как я обновил до последней стабильной node
а также npm
, Я старался npm install moment --save
, Сохраняет запись в package.json
с caret(^)
префикс. Раньше это было tilde(~)
префикс.
- Почему эти изменения сделаны в
npm
? - В чем разница между
tilde(~)
а такжеcaret(^)
? - В чем преимущества перед другими?
21 ответ
Проще говоря, тильда соответствует последней младшей версии (среднему числу). ~1.2.3 будет соответствовать всем версиям 1.2.x, но будет отсутствовать 1.3.0.
Каретка, с другой стороны, более расслабленная. Он обновит вас до самой последней основной версии (первый номер). ^1.2.3 будет соответствовать любому выпуску 1.xx, включая 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
~version
"Примерно эквивалентно версии". См. Nmm semver - 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".
Semver
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
- Для тестирования используйте калькулятор npm. (Хотя объяснения ^ (включают в себя все, что больше определенной версии в том же основном диапазоне) и ~ (включают все, что выше определенной версии в том же младшем диапазоне) не являются на 100% правильными, калькулятор работает нормально)
- В качестве альтернативы, используйте SemVer Check, который не требует выбора пакета, а также предлагает объяснения.
Разрешить или запретить изменения
- Версия для пин-кода:
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.2.3 будет соответствовать всем версиям 1.2.x, но будет отсутствовать 1.3.0.
- Тильда (~) дает вам исправления ошибок
^ Caret:
^
исправляет только основной номер.- Он используется, когда вы внимательно следите за своими зависимостями и готовы быстро изменить ваш код, если вспомогательный выпуск будет несовместим.
- Он обновит вас до самой последней основной версии (первый номер).
- ^ 1.2.3 будет соответствовать любому выпуску 1.xx, включая 1.3.0, но он будет удерживаться на 2.0.0.
- Caret (^) также предоставляет вам обратно совместимые новые функции.
^
это 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.
карат ^
включите все больше, чем конкретная версия в тот же основной диапазон.
тильда ~
включите все, что больше, чем конкретная версия в тот же младший диапазон.
Например, чтобы указать допустимые диапазоны версий до 1.0.4, используйте следующий синтаксис:
- Патч-релизы: 1.0 или 1.0.x или ~1.0.4
- Незначительные выпуски: 1 или 1.x или ^1.0.4
- Основные релизы: * или x
Для получения дополнительной информации о синтаксическом семантическом управлении версиями см. Калькулятор nmm semver.
Больше из документации npm О семантическом управлении версиями
Тильда (~)
исправлена основная версия, исправлена вспомогательная версия, соответствует любому номеру сборки
"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.build (например, 2.4.1)
npm проверяет и исправляет версию определенного пакета на основе этих символов
~: исправлена основная версия, исправлена вспомогательная версия, соответствует любому номеру сборки
Например: ~2.4.1 означает, что он проверит на 2.4.x, где x это что-нибудь
^: основная версия исправлена, соответствует любой дополнительной версии, соответствует любому номеру сборки
Например: ^2.4.1 означает, что он проверит на 2.xx, где х является чем-либо
Тильда ~ соответствует второстепенной версии, если вы установили пакет с 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"
Последняя версия * Если вы хотите установить последнюю версию, используйте только * перед именем пакета.
Возможно, вы видели тильду (~) и каретку (^) в package.json. В чем разница между ними?
Когда вы делаете npm install момент --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
Семвер разделен на 3 основных раздела, разбитых точками.
major.minor.patch
1.0.0
Эти разные основные, второстепенные и патчи используются для идентификации разных выпусков. tide (~) и курсор (^) используются для определения дополнительной версии и версии исправления, которые будут использоваться при управлении версиями пакета.
~1.0.1
Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1
В связи с этим вопросом вы можете просмотреть документацию Composer по версиям, но здесь вкратце:
- Диапазон версий тильды (~) - ~ 1.2.3 эквивалентен> = 1.2.3 < 1.3.0
- Диапазон версии каретки (^) - ~ 1.2.3 эквивалентен> = 1.2.3 < 2.0.0
Таким образом, с помощью Тильды вы будете получать автоматические обновления патчей, но младшие и основные версии обновляться не будут. Однако, если вы используете Caret, вы получите исправления и второстепенные версии, но не получите основных (критических изменений) версий.
Версия Tilde считается "более безопасным" подходом, но если вы используете надежные зависимости (хорошо поддерживаемые библиотеки), у вас не должно возникнуть проблем с версией Caret (поскольку незначительные изменения не должны нарушать работу изменений.
Вероятно, вам стоит просмотреть этот пост stackru о различиях между установкой композитора и обновлением композитора.
Не ответ, как таковой, но наблюдение, которое, кажется, было упущено.
Описание для каратовых диапазонов:
см.: https://github.com/npm/node-semver
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 нет ничего, что требовало бы, чтобы числовые поля были однозначными.
Например, для: ~1.8.0 вы будете соответствовать всем версиям 1.8.x, но потеряете 1.9.0 (это поведение по умолчанию).
Например, для: ^1.8.0 вы будете обновлены до последней основной версии (первого выпуска). Любой выпуск 1.xx, включая 1.9.0, но сохраняющий дистанцию от версии 2.0.0
Пример 3.9.2:
Symbol Dependency Versions Changes
tilde (~) ~3.9.2 3.9.* -bug fix
caret (^) ^3.9.2 3.*.* -backwards compatible new functionality
-old functionality deprecated, but operational
-large internal refactor
-bug fix
Номер версии в синтаксисе, который обозначает каждый раздел с различным значением. синтаксис разбит на три части, разделенные точкой.
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.
~ спецификации для минорных выпусков версий ^ указывает на основные выпуски версий
Например, если версия пакета 4.5.2, при обновлении ~4.5.2 будет установлена последняя версия 4.5.x (МЕНЬШАЯ ВЕРСИЯ) ^4.5.2 установит последнюю версию 4.xx (ОСНОВНАЯ ВЕРСИЯ)
Согласно документам Semver:
Тильда Диапазоны
Разрешает изменения на уровне исправлений, если в компараторе указана дополнительная версия. Если нет, разрешает изменения незначительного уровня.
Например,
- ~1.2.x означает >=1.2.3 <1.3.0
- ~1.2 означает >=1.2.0 <1.3.0
Каретные диапазоны
Разрешены изменения, которые не изменяют крайнюю левую ненулевую цифру в кортеже [основной, второстепенный, исправленный]. Другими словами, это разрешает исправления и второстепенные обновления для версий 1.0.0 и выше, обновления исправлений для версий 0.X >=0.1.0 и отсутствие обновлений для версий 0.0.X.
Примечание. Многие авторы рассматривают версию 0.x так, как если бы x был основным индикатором «критических изменений».
Например,
- ^1.2.x означает >=1.2.0 <2.0.0
- ^1.2.3-beta.2 означает >=1.2.3-beta.2 <2.0.0
- ^0.0.x означает >=0.0.0 <0.1.0
- ^0.0 означает >=0.0.0 <0.1.0