После того, как я повышен до последней стабильной node
и npm
я попробовал npm install moment --save
. Сохраняет запись в префиксе package.json
с кареткой ^
. Раньше это был ~
префикс тильды .
- Почему эти изменения сделаны в
npm
? - В чем разница между тильдой
~
и каретой^
? - В чем преимущества перед другими?
node.js
npm
package.json
semantic-versioning
Физер Хан
источник
источник
npm config set save-prefix=''
. (Вставьте~
в кавычки, если это то, что вы предпочитаете.) Я лично делаю это и упаковываю вещи в производство.Ответы:
См НПХ документов и semver документов :
~ версия «Приблизительно эквивалентна версии» обновит вас до всех будущих версий патча, не увеличивая вспомогательную версию.
~1.2.3
будет использовать релизы от 1.2.3 до <1.3.0.^ версия «Совместимо с версией», обновит вас до всех будущих минорных / патч-версий без увеличения основной версии.
^2.3.4
будет использовать релизы с 2.3.4 до <3.0.0.См. Комментарии ниже для исключений, в частности для предыдущих версий, таких как ^ 0.2.3
источник
^
или a~
. Установите это, если вы хотите иметь жесткий контроль над вашими версиями:npm config set save-prefix=''
0.2.x
,2
не являетсяmajor version
. Вот почему docs.npmjs.com использовал определенные слова:the left-most non-zero digit
. А как насчет этого случая: ^ 0.0.4 означает 0.0.4A
в 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
должно помочь вам избежать этой проблемы.Я также хотел бы добавить официальную документацию по 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.0http://sometarballurl
(это может быть URL-адрес тарбола, который будет загружен и установлен локально*
Соответствует любой версииlatest
Получает последний выпускПриведенный выше список не является исчерпывающим. Другие спецификаторы версий включают в себя URL-адреса GitHub и репозитории пользователей GitHub, локальные пути и пакеты с конкретными тегами npm.
источник
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 и ниже."Approximately equivalent to version"
и"Compatible with version"
такие удручающе неспецифичные способы описания поведения ~ и ^. Спасибо @jgillich за актуальный ответ!npm позволяет установить более новую версию пакета, чем указанная. Использование tilde (
~
) дает вам выпуски исправлений ошибок, а caret (^
) также дает вам обратно совместимые новые функции.Проблема в том, что старые версии обычно не получают исправлений ошибок, поэтому npm
^
по умолчанию использует caret ( )--save
.Согласно: «Семвер объяснил - почему в моем package.json есть каретка (^)?» ,
Обратите внимание, что правила применяются к версиям выше 1.0.0, и не каждый проект следует семантическому версионированию. Для версий 0.xx каретка допускает только обновления патчей , т. Е. Ведет себя так же, как тильда. Смотрите раздел «Кареты»
Вот визуальное объяснение понятий:
Источник: "Semantic Versioning Cheatsheet" .
источник
Semver
Разрешить или запретить изменения
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
Все (надеюсь) возможности
Установить начальный основной уровень и разрешить обновления вверх
Заморозить основной уровень
Заморозить второстепенный уровень
Замораживание уровня патча
Запретить обновления
Примечание : Пропуск основных, второстепенных, патчей или указание
beta
без номера, то же самое, что иany
для пропущенного уровня.Примечание : при установке пакета, имеющего
0
основной уровень, обновление будет устанавливать только новую версию уровня beta / pr! Это потому, чтоnpm
устанавливается^
по умолчанию в,package.json
и когда установленная версия похожа0.1.3
, она замораживает все основные / второстепенные / патч-уровни.источник
~
исправляет старшие и младшие номера. Он используется, когда вы готовы принять исправления ошибок в зависимости, но не хотите каких-либо потенциально несовместимых изменений.^
исправляет только основной номер. Он используется, когда вы внимательно следите за своими зависимостями и готовы быстро изменить ваш код, если вспомогательный выпуск будет несовместим.В дополнение к этому,
^
является не поддерживаются старыми версиями НПХ, и следует использовать с осторожностью.Итак,
^
это хороший дефолт, но он не идеален. Я предлагаю тщательно выбрать и настроить наиболее удобный для вас оператор semver.источник
~
: Достаточно близко к^
: Совместимо систочник
^0.1.3
только принимает версии0.1.x
и не будет принимать0.2.0
, даже если это незначительное увеличение. Это поведение эквивалентно~0.1.3
. Причина такого поведения заключается в том, что пакеты с нулевым выпуском все еще считаются нестабильными; по словам semver.org , # 4, «все может измениться в любое время» (включая изменения, несовместимые с предыдущими версиями ).^
это 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
обновления, и он не сломает свой код).источник
Тильда
~
замораживает старшие и младшие номера.^ Caret:
^
замораживает только основной номер.источник
Тильда ~ соответствует второстепенной версии, если вы установили пакет с 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»
Последняя версия * Если вы хотите установить последнюю версию, используйте только * перед именем пакета.
источник
Одно объяснение лайнера
Стандартная система управления версиями - major.minor.build (например, 2.4.1).
npm проверяет и исправляет версию определенного пакета на основе этих символов
Например: ~ 2.4.1 означает, что он проверит на 2.4.x, где x это что-нибудь
Например: ^ 2.4.1 означает, что он проверит на 2.xx, где х что-нибудь
источник
Возможно, вы видели тильду (~) и каретку (^) в 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
источник
Семвер разделен на 3 основных раздела, разделенных точками.
Эти разные основные, второстепенные и патчи используются для идентификации разных выпусков. tide (~) и caret (^) используют для определения того, какая дополнительная версия и версия патча будут использоваться при создании версий пакета.
источник
Тильда (~)
~4.13.3
означает, что он проверит 4.13.x, где x - что-нибудь, а 4.14.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 О семантическом управлении версиями
источник
Не ответ, как таковой, но наблюдение, которое, кажется, было упущено.
Описание для каратовых диапазонов:
см .: https://github.com/npm/node-semver#caret-ranges-123-025-004
Означает, что
^10.2.3
соответствует10.2.3 <= v < 20.0.0
Я не думаю, что это то, что они имели в виду. Использование версий с 11.xx по 19.xx нарушит ваш код.
Я думаю, что они имели в виду
left most non-zero number field
. В SemVer нет ничего, что требовало бы, чтобы числовые поля были однозначными.источник
~ спецификации для минорных выпусков версий ^ указывает на основные выпуски версий
Например, если версия пакета 4.5.2, при обновлении ~ 4.5.2 будет установлена последняя версия 4.5.x (МЕНЬШАЯ ВЕРСИЯ) ^ 4.5.2 установит последнюю версию 4.xx (ОСНОВНАЯ ВЕРСИЯ)
источник
По этому вопросу вы можете ознакомиться с документацией Composer по версиям , но здесь вкратце:
Таким образом, с Tilde вы будете получать автоматические обновления патчей, но второстепенные и основные версии обновляться не будут. Однако, если вы используете Caret, вы получите исправления и второстепенные версии, но вы не получите основные версии (с критическими изменениями).
Версия Tilde считается «более безопасным», но если вы используете надежные зависимости (хорошо поддерживаемые библиотеки), у вас не должно возникнуть проблем с версией Caret (поскольку незначительные изменения не должны нарушать изменения.
Вероятно, вам следует ознакомиться с этой статьей stackoverflow о различиях между установкой composer и обновлением composer .
источник