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

3390

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

  1. Почему эти изменения сделаны в npm?
  2. В чем разница между тильдой ~и каретой ^?
  3. В чем преимущества перед другими?
Физер Хан
источник
42
FYI вы можете предотвратить префиксы или использовать пользовательские один, выполнив: npm config set save-prefix=''. (Вставьте ~в кавычки, если это то, что вы предпочитаете.) Я лично делаю это и упаковываю вещи в производство.
Fncomp
19
Все мелкие детали о том, как работают тильда и карета, и различия: github.com/npm/node-semver#tilde-ranges-123-12-1
Джеффри Мартинес,
11
Этот инструмент является отличным помощником для тестирования semver.npmjs.com
chaiyachaiya
@fncomp просто хотел уточнить, правильно ли я понял ваш комментарий. Вы используете только определенные версии зависимостей в своем проекте? наша команда не решается обновить зависимости .. вы бы порекомендовали использовать конкретные версии или префикс '~' для зависимостей ..?
blogs4t
@fncomp, не могли бы вы рассказать, что вы имеете в виду, говоря: «Я лично это делаю и упаковываю вещи в производство». Спасибо!
blogs4t

Ответы:

3851

См НПХ документов и semver документов :

  • ~ версия «Приблизительно эквивалентна версии» обновит вас до всех будущих версий патча, не увеличивая вспомогательную версию. ~1.2.3будет использовать релизы от 1.2.3 до <1.3.0.

  • ^ версия «Совместимо с версией», обновит вас до всех будущих минорных / патч-версий без увеличения основной версии. ^2.3.4будет использовать релизы с 2.3.4 до <3.0.0.

См. Комментарии ниже для исключений, в частности для предыдущих версий, таких как ^ 0.2.3

jgillich
источник
325
Публикация здесь, чтобы надеяться поймать людей, которые не совсем продумали это, но и ^ и ~ предполагают, что вы можете доверять второстепенным и точечным релизам из ваших зависимостей. Если вы публикуете библиотеку и хотите, чтобы другие люди доверяли вам, НЕ ПРИНИМАЙТЕ ВЗГЛЯД НА ЗАВИСИМОСТЬ DOWNSTREAM. Падение плохой точки из вашей зависимости может вызвать цепную реакцию вверх по течению, и люди будут стучать в вашу дверь, когда все станет грушевидным. Это еще одна серьезная причина для использования npm shrinkwrap в вашем производственном коде.
tehfoo
8
Вы также можете просто покончить со всей ерундой npm, добавив свои версии с помощью a ^или a ~. Установите это, если вы хотите иметь жесткий контроль над вашими версиями: npm config set save-prefix=''
kumarharsh
5
@prasanthv прав: от docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : диапазоны карет ^ 1.2.3 ^ 0.2.5 ^ 0.0 +0,4. Позволяет вносить изменения, которые не изменяют крайнюю левую ненулевую цифру в кортеже [major, minor, patch]. Другими словами, это позволяет устанавливать исправления и второстепенные обновления для версий 1.0.0 и выше, обновлять исправления для версий 0.X> = 0.1.0 и не обновлять для версий 0.0.X.
rofrol
16
@jgillich в semver, когда вы используете 0.2.x, 2не является major version. Вот почему docs.npmjs.com использовал определенные слова: the left-most non-zero digit. А как насчет этого случая: ^ 0.0.4 означает 0.0.4
rofrol
11
@FagnerBrack: конкретный пример, который вы предоставили, верен, но в целом ваш образ мышления неверен. Например: Допустим, у вас есть пакет Aв 3 -х вариантах: 0.0.1, 0.0.2и 0.0.3. Существует ошибка, 0.0.1так что вы хотите иметь хотя бы 0.0.2в своем пакете B. Если вы напишите, 0.0.xвы получите 0.0.3, что нормально. Но если какой -либо другой пакет Cтребует как Bи Aи дополнительно имеет принуждать "A": "<0.0.2"вы получите 0.0.1без предъявления каких - либо проблем конфликта, который не то , что вы хотите. Использование тильды ~0.0.2должно помочь вам избежать этой проблемы.
Maciej Sz
864

Я также хотел бы добавить официальную документацию по npmjs, в которой описаны все методы, относящиеся к конкретным версиям, включая методы, упомянутые в вопросе

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version«Примерно эквивалентно версии». См. Npm 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.0
  • http://sometarballurl (это может быть URL-адрес тарбола, который будет загружен и установлен локально
  • * Соответствует любой версии
  • latest Получает последний выпуск

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

Ahmad
источник
8
Также можно указать точный диапазон версий, например 1.2.0 || >=1.2.2 <1.3.0: точно 1.2.0 или все от 1.2.2 до 1.3.0 (включительно), но не 1.2.1 или 1.3.1 и выше, а также не 1.1 .x и ниже.
CodeManX
Более конкретная ссылка приведена выше -> docs.npmjs.com/files/package.json#dependencies
Тоби
"Approximately equivalent to version"и "Compatible with version"такие удручающе неспецифичные способы описания поведения ~ и ^. Спасибо @jgillich за актуальный ответ!
Скотт Стаффорд
636

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

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

стол

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

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

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

схема деления

Источник: "Semantic Versioning Cheatsheet" .

ПГПИ
источник
2
Как насчет ^ 0.2.5? от docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : диапазоны карет ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Позволяет вносить изменения, которые не изменяют крайнюю левую ненулевую цифру в кортеже [major, minor, patch]. Другими словами, это позволяет устанавливать исправления и второстепенные обновления для версий 1.0.0 и выше, обновлять исправления для версий 0.X> = 0.1.0 и не обновлять для версий 0.0.X.
rofrol
11
@rofrol любая версия до 1.0.0 считается нестабильной, и эти правила не применяются
pspi
2
Таким образом, ваше объяснение не завершено
rofrol
5
@rofrol Да, иногда плохое опускание для читабельности, шансы иметь что-либо ниже 1.0.0 для зависимости в пакете json довольно низки. см. также принцип 20/80, это прекрасное правило для того, чтобы сосредоточиться на том, что имеет значение
pspi
1
@pspi Наличие версий ниже 1.0.0 "маловероятно"? Из 60 у нас ~ 15, и большинство из них не совсем неизвестны.
Дейв Ньютон,
99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Использование НПМ semver калькулятор для тестирования. (Хотя объяснения ^ (включают в себя все, что больше определенной версии в том же основном диапазоне) и ~ (включают все, что выше определенной версии в том же младшем диапазоне) не являются на 100% правильными, калькулятор работает нормально )
  • В качестве альтернативы, используйте SemVer Check , который не требует выбора пакета, а также предлагает объяснения.

Разрешить или запретить изменения

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

rofrol
источник
Говорить людям, чтобы они не запускали проекты с 0, потому что разработчики из библиотек и потребителей не понимают систему, это ужасное решение. Я думаю, что @asdfasdfads имеет гораздо лучшую информацию.
ProLoser
@ProLoser Я просто считаю, что система должна быть упрощена, и мы не должны использовать версии 0.x.
rofrol
1
Вариант использования ранней разработки жизненного цикла и v0 имеет много смысла. Изучение правильного поведения v0 фактически заставило меня с нетерпением ждать других проектов на ранних этапах жизненного цикла. Это означает, что у вас может быть быстро изменяющийся API с большой обратной несовместимостью без необходимости объявлять ваш проект как 1.x (иначе: стабильный), когда это действительно не так.
ProLoser
Я понимаю это, но мне просто не нравится, как это работает с semver и квалификаторами
rofrol
2
Это больше похоже на мнение и не должно восприниматься как общепринятый подход. И ^ 0.1.x получает патчи отлично.
ProLoser
93

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

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

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

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

Алекс
источник
13
не соответствует действительности: диапазоны карет ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Позволяет вносить изменения, которые не изменяют крайнюю левую ненулевую цифру в кортеже [major, minor, patch]. Другими словами, это позволяет устанавливать исправления и второстепенные обновления для версий 1.0.0 и выше, обновлять исправления для версий 0.X> = 0.1.0 и не обновлять для версий 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol
6
Этот ответ совершенно неверен (как и многие другие здесь). Ни один из них никогда не исправит главное число! Как сказал @rofrol, ^ просто оставляет самую левую ненулевую цифру без изменений. ~ с другой стороны, разрешает только исправления обновлений, если указана младшая версия (например, ~ 1.2.3 или ~ 1.2), и разрешает второстепенные обновления, если младшая версия не указана (например, ~ 1).
TheBaj
2
@TheBaj Они означают «исправить» как «определить» («fixate»), а не «настроить», так что вы все согласны с тем, как обрабатывается основное число.
Мааартин
1
Да, этот ответ казался полностью задом наперед, пока я не понял, что ответчик имел в виду «исправить», как «сделать фиксированным, стационарным или неизменным».
NattyC
57

~: Достаточно близко к

   ~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
haotang
источник
17
@kytwb - нет. В особом случае номеров версий нулевого выпуска карат эквивалентен тильде. Таким образом, ^0.1.3только принимает версии 0.1.xи не будет принимать 0.2.0, даже если это незначительное увеличение. Это поведение эквивалентно ~0.1.3. Причина такого поведения заключается в том, что пакеты с нулевым выпуском все еще считаются нестабильными; по словам semver.org , # 4, «все может измениться в любое время» (включая изменения, несовместимые с предыдущими версиями ).
chharvey
31

^ это 1. [любой]. [любой] (последняя минорная версия)
~ равен 1.2. [любой] (последний патч)

Прекрасно читаем этот пост в блоге о том, как semver применяется к npm
и что они делают, чтобы он соответствовал стандарту semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0

Уилл Стерн
источник
2
не соответствует действительности: диапазоны карет ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Позволяет вносить изменения, которые не изменяют крайнюю левую ненулевую цифру в кортеже [major, minor, patch]. Другими словами, это позволяет устанавливать исправления и второстепенные обновления для версий 1.0.0 и выше, обновлять исправления для версий 0.X> = 0.1.0 и не обновлять для версий 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol
28

Шляпное совпадение может считаться «сломанным», потому что оно не будет обновляться ^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.
catamphetamine
источник
Этот комментарий был до смешного полезен и, похоже, не очень хорошо задокументирован. У вас есть ссылка на документацию об этом поведении? Этот ответ о v0 проектах мне очень помог.
ProLoser
У меня нет ссылки: я тоже нашел эту информацию, погуглив и поиграв с калькулятором семантической версии npm semver.npmjs.com
catamphetamine
2
Необходимо добавить к их документации более формальным способом. Я выступил в Sony с моей инженерной командой, потому что, кажется, ее так легко не заметить. slides.com/proloser/semver-v0
ProLoser
24

Тильда

  • ~замораживает старшие и младшие номера.
  • Он используется, когда вы готовы принять исправления ошибок в зависимости, но не хотите каких-либо потенциально несовместимых изменений.
  • Тильда соответствует последней младшей версии (среднее число).
  • ~ 1.2.3 будет соответствовать всем версиям 1.2.x, но будет отсутствовать 1.3.0.
  • Тильда (~) дает вам исправления ошибок

^ Caret:

  • ^ замораживает только основной номер.
  • Он используется, когда вы внимательно следите за своими зависимостями и готовы быстро изменить ваш код, если вспомогательный выпуск будет несовместим.
  • Он обновит вас до последней основной версии (первый номер).
  • ^ 1.2.3 будет соответствовать любому выпуску 1.xx, включая 1.3.0, но он останется на 2.0.0.
  • Caret (^) также предоставляет вам обратно совместимые новые функции.
Лакшми
источник
1
Тильда соответствует самой последней версии патча (последний номер). Каретка соответствует самой последней вспомогательной версии (среднее число).
Абдул Рауф
"зависает" - лучшее объяснение.
Мхраби
Карет как замораживает основной номер, так и обновит вас до последней основной версии (первый номер)? Старший номер - это первый номер, так что это не имеет смысла.
NattyC
19

Тильда ~ соответствует второстепенной версии, если вы установили пакет с 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»

Последняя версия * Если вы хотите установить последнюю версию, используйте только * перед именем пакета.

Мудассир
источник
3
Этот ответ вводит в заблуждение. SemVer четко заявляет, что обычный номер версии ДОЛЖЕН принимать форму XYZ [где] X - основная версия, Y - вспомогательная версия, а Z - версия исправления.
Лев
15

Одно объяснение лайнера

Стандартная система управления версиями - major.minor.build (например, 2.4.1).

npm проверяет и исправляет версию определенного пакета на основе этих символов

~ : исправлена ​​основная версия, исправлена ​​вспомогательная версия, соответствует любому номеру сборки

Например: ~ 2.4.1 означает, что он проверит на 2.4.x, где x это что-нибудь

^ : основная версия исправлена, соответствует любой дополнительной версии, соответствует любому номеру сборки

Например: ^ 2.4.1 означает, что он проверит на 2.xx, где х что-нибудь

Авинаш
источник
5
В этом ответе я вижу 7 строк
FluxLemur
11

Возможно, вы видели тильду (~) и каретку (^) в 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

Абду Самех
источник
Опять же, этот ответ вводит в заблуждение. SemVer четко заявляет, что обычный номер версии ДОЛЖЕН принимать форму XYZ [где] X - основная версия, Y - вспомогательная версия, а Z - версия исправления.
Лев
5

Семвер разделен на 3 основных раздела, разделенных точками.

major.minor.patch
1.0.0

Эти разные основные, второстепенные и патчи используются для идентификации разных выпусков. tide (~) и caret (^) используют для определения того, какая дополнительная версия и версия патча будут использоваться при создании версий пакета.

~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
ирешика пиюмалие
источник
4

Тильда (~)

исправлена ​​основная версия, исправлена ​​вспомогательная версия, соответствует любому номеру сборки

"express": "~4.13.3" 

~4.13.3 означает, что он проверит 4.13.x, где x - что-нибудь, а 4.14.0

Карета (^)

основная версия исправлена, соответствует любой дополнительной версии, соответствует любому номеру сборки

"supertest": "^3.0.0"

^3.0.0 означает, что он проверит на 3.xx, где х что-нибудь

Фархан Ясен
источник
Можете ли вы рассказать, чем этот ответ отличается от того же ответа, который был опубликован 4 года назад ?
Франклин Ю
2

Номер версии в синтаксисе, который обозначает каждый раздел с различным значением. синтаксис разбит на три части, разделенные точкой.

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
Можете ли вы рассказать, чем этот ответ отличается от того же ответа, который был опубликован 4 года назад ?
Франклин Ю
2

Карат ^ включает в себя все, что больше, чем конкретная версия в том же основном диапазоне.

тильда ~ включает все, что больше, чем конкретная версия в том же младшем диапазоне.

Например, чтобы указать допустимые диапазоны версий до 1.0.4, используйте следующий синтаксис:

  • Патч-релизы: 1.0 или 1.0.x или ~ 1.0.4
  • Незначительные выпуски: 1 или 1.x или ^ 1.0.4
  • Основные релизы: * или x

Для получения дополнительной информации о синтаксическом семантическом управлении версиями см. Калькулятор nmm semver .

семантические версии npm в опубликованных пакетах§

Больше из документации npm О семантическом управлении версиями

ElasticCode
источник
1

Не ответ, как таковой, но наблюдение, которое, кажется, было упущено.

Описание для каратовых диапазонов:

см .: https://github.com/npm/node-semver#caret-ranges-123-025-004

Позволяет вносить изменения, которые не изменяют крайнюю левую ненулевую цифру в кортеже [major, minor, patch].

Означает, что ^10.2.3соответствует10.2.3 <= v < 20.0.0

Я не думаю, что это то, что они имели в виду. Использование версий с 11.xx по 19.xx нарушит ваш код.

Я думаю, что они имели в виду left most non-zero number field. В SemVer нет ничего, что требовало бы, чтобы числовые поля были однозначными.

Джесси Чисхолм
источник
0

~ спецификации для минорных выпусков версий ^ указывает на основные выпуски версий

Например, если версия пакета 4.5.2, при обновлении ~ 4.5.2 будет установлена ​​последняя версия 4.5.x (МЕНЬШАЯ ВЕРСИЯ) ^ 4.5.2 установит последнюю версию 4.xx (ОСНОВНАЯ ВЕРСИЯ)

user2849063
источник
8
Можете ли вы рассказать, чем этот ответ отличается от того же ответа, который был опубликован 4 года назад ?
Франклин Ю
0

По этому вопросу вы можете ознакомиться с документацией Composer по версиям , но здесь вкратце:

  • Диапазон версий тильды ( ~ ) - ~ 1.2.3 эквивалентен> = 1.2.3 < 1.3.0
  • Диапазон версий каретки ( ^ ) - ~ 1.2.3 эквивалентен> = 1.2.3 < 2.0.0

Таким образом, с Tilde вы будете получать автоматические обновления патчей, но второстепенные и основные версии обновляться не будут. Однако, если вы используете Caret, вы получите исправления и второстепенные версии, но вы не получите основные версии (с критическими изменениями).

Версия Tilde считается «более безопасным», но если вы используете надежные зависимости (хорошо поддерживаемые библиотеки), у вас не должно возникнуть проблем с версией Caret (поскольку незначительные изменения не должны нарушать изменения.

Вероятно, вам следует ознакомиться с этой статьей stackoverflow о различиях между установкой composer и обновлением composer .

milan.latinovic
источник