Вопрос: В чем разница между тильдой (~) и кареткой (^) в пакете.json?


После того, как я обновился до последней стабильной nodeа также npm, Я пытался npm install moment --save, Он сохраняет запись в package.jsonс caret(^)префикс. Раньше это был tilde(~)префикс.

  1. Почему эти изменения сделаны в npm?
  2. В чем разница между tilde(~)а также caret(^)?
  3. В чем преимущества над другими?

2174


источник


Ответы:


Проще говоря, тильда соответствует последней второстепенной версии   (среднее число). ~ 1.2.3 будет соответствовать всем версиям 1.2.x, но будет   промах 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/


2543



Я хотел бы также добавить официальную документацию 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 - Диапазоны резкости & semver (7)
  • versionНеобходимо точно соответствовать версии
  • >versionДолжна быть больше версии
  • >=versionи т.д
  • <version
  • <=version
  • 1.2.x1.2.0, 1.2.1 и т. Д., Но не 1.3.0
  • http://sometarballurl(это может быть URL-адрес tarball, который будет загружен и установлен локально
  • *Соответствует любой версии
  • latestПолучает последний выпуск

Вышеприведенный список не является исчерпывающим. Другие спецификаторы версии включают URL-адреса GitHub и пользовательские репо, GitHub, локальные пути и пакеты с определенными тегами npm


544



Npm позволяет устанавливать более новую версию пакета, чем указанная. Использование тильды ( ~) дает вам исправления ошибок и карет ( ^) дает вам обратно совместимую новую функциональность.

Проблема состоит в том, что старые версии обычно не получают исправлений ошибок, поэтому npm использует каретку ( ^) по умолчанию для --save,

semver table

В соответствии с: «Семвер объяснил - почему в моем пакете.json есть карет (^)?» ,

Заметка что правила применяются к версиям выше 1.0.0, и не каждый проект следует за семантическим версированием. Для версий 0.x.x позволяет только каретка пластырь обновления, то есть он ведет себя так же, как тильда. Видеть «Диапазоны резкости»

Вот визуальное объяснение понятий:

semver diagram

Источник: «Семантическая версия Cheatsheet» ,


322



~исправляет основные и второстепенные номера. Он используется, когда вы готовы принять исправления ошибок в своей зависимости, но не хотите каких-либо потенциально несовместимых изменений.

^фиксирует только основное число. Он используется, когда вы внимательно наблюдаете за своими зависимостями и готовы быстро изменить свой код, если незначительная версия будет несовместимой.

В дополнение к этому, ^является не поддерживается по старым версиям npm, и их следует использовать с осторожностью.

Так, ^является хорошим дефолтом, но он не идеален. Я предлагаю тщательно выбрать и настроить оператора semver, который вам больше всего подходит.


73



Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • использование калькулятор sempm sempm для тестирования. (Хотя объяснения для ^ (включая все, что больше, чем конкретная версия в том же самом диапазоне) и ~ (включая все, что больше, чем конкретная версия в том же диапазоне), не являются 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

Зафиксировать патч-уровень

~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как основной уровень, обновление будет устанавливать только новую версию бета-версии / уровня! Это потому что npmнаборы ^по умолчанию в package.jsonи когда установленная версия похожа на 0.1.3, он замораживает все основные / мелкие / патч-уровни.


62



~: Разумно Закрыть в

   ~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

40



^ is 1.[any].[any] (latest minor version)
~ is 1.2.[any] (latest patch)

A great read is this blog post on how semver applies to npm
and what they're doing to make it match the semver standard
http://blog.npmjs.org/post/98131109725/npm-2-0-0


20



Hat matching may be considered "broken" because it wont update ^0.1.2 to 0.2.0. When the software is emerging use 0.x.y versions and hat matching will only match the last varying digit (y). This is done on purpose. The reason is that while the software is evolving the API changes rapidly: one day you have these methods and the other day you have those methods and the old ones are gone. If you don't want to break the code for people who already are using your library you go and increment the major version: e.g. 1.0.0 -> 2.0.0 -> 3.0.0. So, by the time your software is finally 100% done and full-featured it will be like version 11.0.0 and that doesn't look very meaningful, and actually looks confusing. If you were, on the other hand, using 0.1.x -> 0.2.x -> 0.3.x versions then by the time the software is finally 100% done and full-featured it is released as version 1.0.0 and it means "This release is a long-term service one, you can proceed and use this version of the library in your production code, and the author won't change everything tomorrow, or next month, and he won't abandon the package".

The rule is: use 0.x.y versioning when your software hasn't yet matured and release it with incrementing the middle digit when your public API changes (therefore people having ^0.1.0 won't get 0.2.0 update and it won't break their code). Then, when the software matures, release it under 1.0.0 and increment the leftmost digit each time your public API changes (therefore people having ^1.0.0 won't get 2.0.0 update and it won't break their code).

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.

20



One liner explanation

The standard versioning system is major.minor.build (e.g. 2.4.1)

npm checks and fixes the version of a particular package based on these characters

~ : major version is fixed, minor version is fixed, matches any build number

e.g. : ~2.4.1 means it will check for 2.4.x where x is anything

^ : major version is fixed, matches any minor version, matches any build number

e.g. : ^2.4.1 means it will check for 2.x.x where x is anything


8



~ Tilde:

  • ~ fixes major and minor numbers.
  • It is used when you're ready to accept bug-fixes in your dependency, but don't want any potentially incompatible changes.
  • The tilde matches the most recent minor version (the middle number).
  • ~1.2.3 will match all 1.2.x versions, but it will miss 1.3.0.
  • Tilde (~) gives you bug fix releases

^ Caret:

  • ^ fixes the major number only.
  • It is used when you're closely watching your dependencies and are ready to quickly change your code if minor release will be incompatible.
  • It will update you to the most recent major version (the first number).
  • ^1.2.3 will match any 1.x.x release including 1.3.0, but it will hold off on 2.0.0.
  • Caret (^) gives you backwards-compatible new functionality as well.

3



Tilde (~)

major version is fixed, minor version is fixed, matches any build number

"express": "~4.13.3" 

~4.13.3 means it will check for 4.13.x where x is anything and 4.14.0

Caret (^)

major version is fixed, matches any minor version, matches any build number

"supertest": "^3.0.0"

^3.0.0 means it will check for 3.x.x where x is anything


2



^ : Accept version changes less than Left Most Non-Zero Version (1st no-zero version digit from left side).

~ : Accept version changes less than 2nd Left Most Non-Zero Version (2nd no-zero version digit from left side). OR If there is no 2nd Left most Non-Zero version then Accept version changes less than Left most version.


1