Питання Яка різниця між тильдою (~) і caret (^) в package.json?


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

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

2249
2018-03-12 06:02


походження


FYI ви можете запобігти префіксам або користуватися індивідуальним шляхом: npm config set save-prefix=''. (Stick ~ в котируваннях, якщо це те, що ви віддаєте перевагу.) Особисто я роблю це і стискаю речі у виробництві. - fncomp
Всі незграбні пісні деталі про те, як працюють тильда і каретка, і відмінності: github.com/npm/node-semver#tilde-ranges-123-12-1 - Jeffrey Martinez
Цей інструмент є чудовим помічником для перевірки semver.npmjs.com - chaiyachaiya
@fncomp просто хотів роз'яснити, чи правильно я отримав ваш коментар ... чи використовуєте ви лише конкретні версії залежностей у вашому проекті? наша команда сумнівається в модернізації залежностей .. Ви б рекомендували використовувати певні версії або "~" префікс для залежностей ..? - blogs4t
@ fncomp чи могли б ви проінформувати про те, що ви маєте на увазі, говорячи: "Я особисто роблю це і скорочую упаковку для речей у виробництві". Дякую! - blogs4t


Відповіді:


У найпростіших випадках тильда збігається з останньою незначною версією   (середній номер). ~ 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/


2640
2018-03-12 08:28



Публікуйте тут, щоб, сподіваємось, зловити людей, які не зовсім думають про це, але як ^, так і ~ припускають, що ви можете довіряти дрібним і точкам релізи з ваших залежностей. Якщо ви публікуєте бібліотеку та бажаєте, щоб інші люди довіряли вам, НЕ НЕПРИЯТНО ПРИЙМАЙТЕСЬ ДЕМОНТАЖНИХ ВІДПОВІДАЛЬНОСТІ. Погана точка звільнення від вашої залежності може призвести до ланцюгової реакції вгору за течією, і люди будуть стукати у ваші двері, коли речі потраплять у формі груші. Це ще одна величезна причина для використання npm shrinkwrap на вашому виробничому коді. - tehfoo
Це вводить в оману ^. Це говорить про це ^  буде оновлювати вас до найновіших мажор версія, коли в дійсності він оновлює вас до найновіших неповнолітній версія тобто: - ^ 1.2.3: => = 1.2.3 <2.0.0 - ^ 0.2.3: => = 0.2.3 <0.3.0 - ^ 0.0.3: => = 0.0.3 <0.0.4 - prasanthv
@ jgillich в semmer, коли ви використовуєте 0.2.x, 2 це не а major version. Ось чому docs.npmjs.com використовували конкретні слова: the left-most non-zero digit. Також як щодо цього випадку: ^ 0.0.4 означає 0.0.4 - rofrol
@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
Дивно, що це неправильна відповідь It will update you to the most recent major version має 2k + upvotes. Цікаво, скільки людей там зараз думають про це ^ Оновлює основну версію! Існує не двозначно навколо того, що означає головне / незначне / патч у версії semserv - це просто просто неправильно - Drenai


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

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

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

  • ~version "Приблизно еквівалентно версії" Див npm semver - діапазони Тильда & Семер (7)
  • ^version "Сумісна з версією" Див npm semver - Caret діапазони & Семер (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


571
2017-09-16 06:25



Також можна вказати точний діапазон версій, наприклад 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
@CoDEmanX чому включено 1.3.0, якщо ви використовуєте <? - Janus Troelsen
Мій поганий, він повинен був читати <=1.3.0. - CoDEmanX
Чи можливо 1.x.x? - Venryx
@ Венрикс так, це так. Це буде будь-яка версія> = 1.0.0 та <2.0.0 - Ahmad


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

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

semver table

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

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

Ось візуальне пояснення понять:

semver diagram

Джерело: "Семантичний друкарський версію версій".


349
2017-07-30 20:40



Що приблизно ^ 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
@rofrol будь-яка версія до 1.0.0 вважається нестабільною, і ці правила не застосовуються - pspi
Отже, ваше пояснення не є повним - rofrol
@rofrol так, пропускаючи для читабельності, іноді гарна, шанси мати щось нижче 1.0.0 для залежності в пакеті json досить низькі. див. також принцип 20/80, є чудовим правилом для зосередження уваги на важливості - pspi
Подивись мою відповідь. Що ти думаєш? stackoverflow.com/questions/22343224/... - rofrol


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

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

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

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


74
2018-03-12 23:05



невірно: Картові діапазони ^ 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
Ця відповідь абсолютно неправильна (як і багато інших тут). Ніхто з них ніколи не фіксує основне число! Як сказав @rofrol, ^ просто залишає ліву більшість ненульових цифр без змін. ~, з іншого боку, дозволяє виправляти лише оновлення, якщо вказано незначну версію (наприклад, ~ 1.2.3 або ~ 1.2) і дозволяє незначні оновлення, якщо незначна версія не вказана (наприклад, ~ 1). - TheBaj
@TheBaj Вони означають "виправити" як "define" ("fixate"), а не "adjust", так що ви всі погоджуєтеся, як обробляється основний номер. - maaartinus


Семпер

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Використовуйте npm semmer калькулятор для тестування. (Незважаючи на те, що пояснення для ^ (включають все більше, ніж конкретна версія в одному і тому ж основному діапазоні) і ~ (включають все, що перевищує певну версію в тій самій невеликій діапазоні), не є 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, він заморожує всі основні / другорядні рівні / патч.


66
2017-10-11 16:52



Наказуючи людям уникати розпочати проекти з 0, оскільки бібліотека та споживачі, що розробляють, не розуміють, що система - страшне рішення. Я думаю, @asdfasdfads має набагато кращу інформацію. - ProLoser
@ProLoser Я просто думаю, що цю систему слід спростити, і ми не повинні використовувати версії 0.x. - rofrol
Випадок використання раннього розвитку життєвого циклу та v0 робить багато сенсу. Дізнавшись, як поведінка v0 правильно, я з нетерпінням чекаю на інші проекти раннього життєвого циклу. Це означає, що ви можете мати швидко мінливий API з великою кількістю зворотної несумісності, не будучи змушені оголосити ваш проект 1.x (ака: стабільний), коли це насправді не так. - ProLoser
Я це розумію, але мені просто не подобається, як він працює з semver та qualifiers - rofrol
Це більше схоже на думку і не повинно сформуватися як загальноприйнятий підхід. А ^ 0.1.x отримує патчі чудово. - ProLoser


~ : Розумно закрити до

   ~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

42
2018-06-27 16:12



^0.1.3: 0.1.3 <= accepted < 1.0.0 замість цього ні? - kytwb
@kytwb - немає У спеціальному випадку номерів версій з нульовим випуском карат еквівалентний тильді. Таким чином ^0.1.3приймає тільки версії 0.1.x і не приймуть 0.2.0, хоча це і є незначне збільшення. Ця поведінка еквівалентна ~0.1.3. Обгрунтування цієї поведінки обумовлено тим, що пакети з нульовим вивільненням все ще вважаються нестабільними; у словах semver.org, № 4, "що-небудь може змінюватися в будь-який час" (включаючи зворотні несумісні зміни). - chharvey


Співпадіння шапки може вважатися "зламаним", оскільки він не буде оновлюватися ^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.

21
2017-10-19 11:24



Цей коментар був смішно корисним і, здається, не дуже добре оформлений. У вас є посилання на документацію щодо цієї поведінки? Ця відповідь про проекти v0 допомогла мені багато чого. - ProLoser
У мене немає посилання: я також знайшов цю інформацію, використовуючи Google Reading і граючи з калькулятором семантичної версії npm semver.npmjs.com - asdfasdfads
Потрібно додавати їх до документації більш формально. Я розмовляв у Sony зі своєю інженерною командою, тому що, здається, це так легко забуваєш. slides.com/proloser/semver-v0 - ProLoser