Яка різниця між tilde (~) та caret (^) у package.json?


3383

Після того як я перейшов до останнього стабільного nodeі npm, я спробував npm install moment --save. Це зберігає запис у префіксі package.jsoncaret ^. Раніше це був ~префікс тильди .

  1. Чому ці зміни вносяться npm?
  2. Чим відрізняється тильда від ~карета ^?
  3. Які переваги перед іншими?

42
FYI ви можете запобігти префікси або використовувати призначені для користувача один, виконавши: npm config set save-prefix=''. (Дотримуйтесь ~цитат, якщо це вам більше подобається.) Я особисто це роблю і стискаю речі для виробництва.
fncomp


11
Цей інструмент є прекрасним помічником для тестування semver.npmjs.com
chaiyachaiya

@fncomp просто хотів уточнити, чи правильно я отримав ваш коментар. Чи використовуєте ви лише конкретні версії залежностей у своєму проекті? наша команда вагається з оновленням залежностей. Чи рекомендуєте ви використовувати конкретні версії або префікс '~' для залежностей ..?
blogs4t

@fncomp, будь ласка, розкажіть, будь ласка, що ви маєте на увазі, кажучи: "Я особисто це роблю і скорочуюся для речей у виробництві". Дякую!
blogs4t

Відповіді:


3842

Див. Документи NPM та документи semver

~ версія "Приблизно еквівалентна версії", оновить вас до всіх майбутніх версій патчу, не збільшуючи другорядну версію. ~1.2.3використовуватиме випуски від 1.2.3 до <1.3.0.

^ версія «Сумісна з версією» оновить вас до всіх майбутніх мінорних / патч-версій, не збільшуючи основної версії. ^2.3.4використовуватиме випуски від 2.3.4 до <3.0.0.

Дивіться коментарі нижче.


325
Опублікувавши тут, ми сподіваємось наздогнати людей, які не дуже задумуються над цим, але обидва ^ і ~ припускають, що ви можете довіряти незначним та точним звільненням від своїх залежностей. Якщо ви публікуєте бібліотеку і хочете, щоб інші люди вам довіряли, НЕ ПРИЙНЯТЬ ПРИЙМАНО ЗАХИСТАННЯ ДОНСТРЕЙМУ. Поганий вивільнення точки від вашої залежності може спричинити ланцюгову реакцію вгору за течією, і люди будуть стукати у ваші двері, коли речі йдуть у грушу. Це ще одна величезна причина, щоб використовувати скорочення скорочення npm у виробничому коді.
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 .4. Дозволяє зміни, які не змінюють найбільшу нульову цифру в кортежі [основний, другорядний, виправлення]. Іншими словами, це дозволяє виправлення та незначні оновлення для версій 1.0.0 і вище, оновлення патчів для версій 0.X> = 0.1.0, а також оновлення для версій 0.0.X.
rofrol

15
@jgillich у semver, коли ви використовуєте 0.2.x, 2це не a 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

861

Я хотів би додати офіційну документацію на 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.x 1.2.0, 1.2.1 тощо, але не 1.3.0
  • http://sometarballurl (це може бути URL тарболу, який буде завантажено та встановлено локально
  • * Відповідає будь-якій версії
  • latest Отримує останню версію

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


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#dependitions
Тобі

"Approximately equivalent to version"і "Compatible with version"такі неприємні неспецифічні способи описати поведінку ~ та ^. Дякую @jgillich за фактичну відповідь!
Скотт Стаффорд

635

npm дозволяє встановити нову версію пакета, ніж вказана. Використання tilde ( ~) дає випуски виправлень помилок, а caret ( ^) також дає нову функціональну сумісність.

Проблема в старих версіях зазвичай не отримує стільки виправлень помилок, тому npm використовує caret ( ^) за замовчуванням --save.

северна таблиця

Відповідно до цього: "Семвер пояснив - чому в моїм пакеті.json є каре (^)?".

Зауважте, що правила стосуються версій вище 1.0.0, і не кожен проект дотримується семантичної версії. Для версій 0.xx каретка дозволяє лише оновлення виправлень , тобто вона поводиться так само, як і тильда. Див. "Діапазони карет"

Ось наочне пояснення понять:

северна схема

Джерело: "Шеф-лист семантичної версії" .


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. Дозволяє зміни, які не змінюють найбільшу нульову цифру в кортежі [основний, другорядний, виправлення]. Іншими словами, це дозволяє виправлення та незначні оновлення для версій 1.0.0 і вище, оновлення патчів для версій 0.X> = 0.1.0, а також оновлення для версій 0.0.X.
rofrol

11
@rofrol будь-яка версія до 1.0.0 вважається нестабільною, і ці правила не застосовуються
pspi

2
Тож ваше пояснення не повне
rofrol

5
@rofrol Так, іноді пропускати читабельність добре, шанси на наявність залежності від пакета json у порівнянні з 1,0.0 досить низькі. див. також принцип 20/80, є прекрасним правилом для зосередження уваги на тому, що має значення
pspi

1
@pspi Наявність версій нижче 1.0.0 "малоймовірно"? З 60 у нас ~ 15, і більшість з них не затьмарені.
Дейв Ньютон

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Використовуйте калькулятор npm 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основний рівень, оновлення встановлює лише нову версію бета / pr рівня! Це тому, що npmвстановлено ^як за замовчуванням в, package.jsonі коли встановлена ​​версія схожа0.1.3 , вона заморожує всі основні / мінорні / рівні виправлення.


Розкажіть людям уникати запуску проектів з 0, оскільки розробники бібліотеки та споживачі не розуміють, що система - це жахливе рішення. Я думаю, що у @asdfasdfads є набагато краща інформація.
ProLoser

@ProLoser Я просто думаю, що систему слід спростити, і ми не повинні використовувати версії 0.x.
rofrol

1
Випадок використання навколо раннього розвитку життєвого циклу та v0 має багато сенсу. Навчання того, як v0 поводиться правильно, насправді змусило мене з нетерпінням чекати інших проектів раннього життєвого циклу. Це означає, що ви можете мати API, що швидко змінюється, з великою кількістю несумісності назад, не змушуючи оголошувати проект як 1.x (ака: стабільний), коли він насправді не є.
ProLoser

Я розумію це, але мені просто не подобається, як це працює з semver та кваліфікаторами
rofrol

2
Це більше схоже на думку, і його не слід сприймати як загальноприйнятий підхід. І ^ 0.1.x виходить патчі ідеально добре.
ProLoser

93

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

^фіксує лише основне число. Він використовується, коли ви пильно стежите за своїми залежностями і готові швидко змінити свій код, якщо незначний випуск буде несумісним.

На додаток до цього, ^він не підтримується старими версіями npm, і його слід використовувати обережно.

Отже, ^це хороший дефолт, але він не ідеальний. Я пропоную ретельно вибрати та налаштувати оператор semver, який є найбільш корисним для вас.


13
неправда: Діапазони карет ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Дозволяє зміни, які не змінюють найбільшу нульову цифру в кортежі [основний, другорядний, виправлення]. Іншими словами, це дозволяє виправлення та незначні оновлення для версій 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 Вони мають на увазі "виправити" як "визначити" ("виправити"), а не "скорегувати", тому ви погоджуєтесь з тим, як обробляється основна кількість.
maaartinus

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

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. Дозволяє зміни, які не змінюють найбільшу нульову цифру в кортежі [основний, другорядний, виправлення]. Іншими словами, це дозволяє виправлення та незначні оновлення для версій 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

Відповідності Hat можна вважати «зламаною» , тому що звичка оновлювати ^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.

Цей коментар був смішно корисним і, здається, не дуже добре задокументований. Чи є у вас посилання на документацію навколо такої поведінки? Ця відповідь про 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.
  • Tilde (~) дає виправлення помилок

^ Карета:

  • ^ заморожує тільки основне число
  • Він використовується, коли ви пильно стежите за своїми залежностями і готові швидко змінити свій код, якщо незначний випуск буде несумісним.
  • Він оновить вас до останньої основної версії (перший номер).
  • ^ 1.2.3 відповідатиме будь-якому випуску 1.xx, включаючи 1.3.0, але він затримається на 2.0.0.
  • Caret (^) також дає вам нову функціональну функцію, що відповідає зворотному напрямку.

1
Тильда відповідає останній версії патча (останній номер). Карета відповідає останній другорядній версії (середній номер).
Абдул Рауф

"замерзає" - найкраще пояснення.
mhrabiee

Caret обидва заморожує основну кількість і оновить вас до останньої основної версії (першого номера)? Основне число - це перше число, тому це не має сенсу.
NattyC

19

Tilde ~ відповідає незначній версії, якщо ви встановили пакунок з версією 1.4.2 і після встановлення, версії 1.4.3 та 1.4.4 також доступні, якщо у вашому пакеті.json він використовується як ~ 1.4.2, то встановити npm у вашому проекті після оновлення встановиться 1.4.4 у вашому проекті. Але для цього пакета доступно 1.5.0, він не буде встановлений ~. Його називають другорядним варіантом.

Caret ^ відповідає основній версії, якщо пакет 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, де x - що завгодно


5
Я бачу 7 рядків у цій відповіді
FluxLemur

11

Напевно, ви бачили тильду (~) та каре (^) у пакеті.json. У чому різниця між ними?

Коли ви робите npm install moment --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

semver розділений на 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, де x - що завгодно


Чи можете ви детальніше пояснити, чим ця відповідь відрізняється від тієї ж відповіді, опублікованої 4 роки тому ?
Франклін Ю

2

Номер версії в синтаксисі, який позначає кожен розділ з різним значенням. синтаксис розбитий на три розділи, розділені крапкою.

major.minor.patch 1.0.2

Основні, мінорні та патчі представляють різні випуски пакету.

npm використовує tilde (~) та caret (^), щоб позначити, які патчі та другорядні версії використовувати відповідно.

Отже, якщо ви бачите ~ 1.0.2, це означає встановити версію 1.0.2 або останню версію патча, таку як 1.0.4. Якщо ви бачите ^ 1.0.2, це означає встановити версію 1.0.2 або останню мінорну або виправлену версію, таку як 1.1.0.


1
Чи можете ви детальніше пояснити, чим ця відповідь відрізняється від тієї ж відповіді, опублікованої 4 роки тому ?
Франклін Ю

2

Карат ^ включає все, що перевищує конкретну версію в тому ж самому великому діапазоні.

tilde ~ включає все, що перевищує конкретну версію, в тому ж незначному діапазоні.

Наприклад, щоб вказати прийнятні діапазони версій до 1.0.4, використовуйте наступний синтаксис:

  • Випуски виправлень: 1.0 або 1.0.x або ~ 1.0.4
  • Незначні випуски: 1 або 1.x або ^ 1.0.4
  • Основні випуски: * або x

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

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

Більше з npm-документації Про семантичну версію


1

Не сама відповідь, а спостереження, яке, здається, було упущено з уваги.

Опис діапазонів каратів:

дивіться: 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 немає нічого, що вимагає, щоб числові поля були одноцифровими.


0

~ specfices для другорядних версій ^ вказує на основні версії версій

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


8
Чи можете ви детальніше пояснити, чим ця відповідь відрізняється від тієї ж відповіді, опублікованої 4 роки тому ?
Франклін Ю

0

З цим питанням ви можете переглянути документацію композитора щодо версій , але коротше:

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

Отже, з Tilde ви отримаєте автоматичні оновлення виправлень, але незначні та основні версії не оновлюються. Однак якщо ви користуєтеся Caret, ви отримаєте виправлення та незначні версії, але ви не отримаєте основних (порушуючих змін) версій.

Версія Tilde вважається "безпечнішим" підходом, але якщо ви використовуєте надійні залежності (доглянуті бібліотеки), у вас не повинно виникнути проблем із версією Caret (оскільки незначні зміни не повинні порушувати зміни.

Ви, ймовірно, повинні переглянути цю статтю про перегляд потоку щодо відмінностей між встановленням композитора та оновленням композитора .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.