Jaka jest różnica między tyldą (~) a karetką (^) w pakiecie.json?

Po uaktualnieniu do najnowszej stajni node i npm, próbowałem npm install moment --save. Zapisuje wpis w {[3] } z prefiksem caret ^. Wcześniej był to przedrostek tyldy ~.

  1. dlaczego te zmiany są wprowadzane w npm?
  2. Jaka jest różnica między tyldą ~ a caretem ^?
  3. jakie są zalety nad innymi?
Author: Nikita Fedyashev, 2014-03-12

19 answers

Zobacz npm docs i semver docs :

  • ~version "w przybliżeniu odpowiednik wersji" , zaktualizuje Cię do wszystkich przyszłych wersji łatek, bez zwiększania wersji podrzędnej. ~1.2.3 będzie używać wersji od 1.2.3 do

  • ^version "Compatible with version" , zaktualizuje Cię do wszystkich przyszłych wersji minor / patch, bez zwiększania głównej wersji. ^2.3.4 użyje wersji od 2.3.4 do

Zobacz komentarze poniżej dla wyjątków, w szczególności dla wersji przed jedynką, takich jak ^0.2.3

 4297
Author: jgillich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-23 20:29:01

Chciałbym dodać również oficjalną dokumentację npmjs, która opisuje wszystkie metody dla specyfiki wersji, w tym te, o których mowa w pytaniu -

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

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

  • ~version "w przybliżeniu odpowiednik wersji" Patrz zakresy semver - Tilde npm & semver (7)
  • ^version "Kompatybilny z wersją" Zobacz zakresy semver-Caret & semver (7)
  • version musi dokładnie dopasować wersję
  • >version musi być większa niż wersja
  • >=version etc
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1 itd., ale nie 1.3.0
  • W przeciwieństwie do innych tarballi, tarball nie może być używany przez graczy.]}
  • * pasuje do dowolnej wersji
  • latest uzyskuje najnowszą wersję

Powyższa lista nie jest wyczerpujące. Inne specyfikacje wersji to adresy URL Githuba i repo użytkowników Githuba, ścieżki lokalne i pakiety z określonymi znacznikami npm

 947
Author: Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 13:26:07

Npm pozwala na zainstalowanie nowszej wersji pakietu niż podana. Użycie tilde (~) daje Ci wersje poprawek błędów, a caret (^) daje również kompatybilną wstecz nową funkcjonalność.

Problem polega na tym, że stare wersje zwykle nie otrzymują poprawek błędów, więc npm używa caret (^) jako domyślnej dla --save.

stół semver

Zgodnie z: "Semver wyjaśnił-dlaczego w mojej paczce jest karetka ( ^ ).json?".

Uwaga że zasady dotyczą wersji powyżej 1.0.0 i nie każdy projekt stosuje wersjonowanie semantyczne. Dla wersji 0.X. X karetka zezwala tylko na aktualizacje patch, tzn. zachowuje się tak samo jak tylda. Zobacz "Zakresy Karetek"

Oto wizualne wyjaśnienie pojęć:

diagram semvera

Źródło: "Semantic Versioning Cheatsheet" .

 723
Author: pspi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-16 10:30:47

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • użyj npm SemVer calculator do testowania. Chociaż wyjaśnienia dla ^ (include everything greater than a particular version in the same major range) i ~ (include everything greater than a particular version in the same minor range)nie są w 100% poprawne, Kalkulator wydaje się działać dobrze.
  • alternatywnie, użyj SemVer Check, który nie wymaga wybrania pakietu, a także oferuje wyjaśnienia.

Zezwalaj lub wyłączaj zmiany

  • Wersja pinowa: 1.2.3.
  • użyj ^ (jak głowa). Pozwala na aktualizacje na drugim niezerowym poziomie od lewej: ^0.2.3 oznacza 0.2.3 <= v < 0.3.
  • Użyj ~ (jak ogon). Zazwyczaj zamrozić prawo-najbardziej poziom lub ustawić zero, jeśli pominięte:
  • ~1 oznacza 1.0.0 <= v < 2.0.0
  • ~1.2 oznacza 1.2.0 <= v < 1.3.0.
  • ~1.2.4 oznacza 1.2.4 <= v < 1.3.0.
  • Ommit right-most level: 0.2 oznacza 0.2 <= v < 1. Różni się od ~ ponieważ:
    • wyjściowa pominięta wersja poziomu jest zawsze 0
    • możesz ustawić początkową wersję główną bez określania podpoziomów.

Wszystkie (miejmy nadzieję) możliwości

Ustaw początkowy poziom główny i Zezwalaj na aktualizacje w górę

*  or "(empty string)   any version
1                         v >= 1

Freeze major-level

~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

Freeze minor-level

^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

Freeze patch-level

~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)

Disallow aktualizacje

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Uwaga : brak major, minor, patch lub określenie beta bez numeru, jest takie samo jak any dla brakującego poziomu.

Uwaga : gdy zainstalujesz pakiet, który ma 0 jako główny poziom, aktualizacja zainstaluje tylko nową wersję beta/pr! To dlatego, że npm ustawia ^ jako domyślną w package.json i gdy zainstalowana wersja jest taka jak 0.1.3, zawiesza wszystkie major / minor/patch poziomy.

 121
Author: rofrol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-16 09:27:46

~ naprawia numery główne i podrzędne. Jest używany, gdy jesteś gotowy zaakceptować poprawki błędów w zależności, ale nie chcesz żadnych potencjalnie niezgodnych zmian.

^ naprawia tylko numer główny. Jest używany, gdy uważnie obserwujesz swoje zależności i jesteś gotowy, aby szybko zmienić kod, jeśli moll release będzie niekompatybilne.

Oprócz tego, ^ jest nie wspierane przez stare wersje npm i powinno być używane z ostrożnością.

Więc, ^ jest dobre domyślne, ale nie idealne. Proponuję starannie wybrać i skonfigurować operator semver, który jest dla Ciebie najbardziej przydatny.

 99
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-20 13:45:39

~ : rozsądnie blisko do

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: kompatybilny z

   ^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
 61
Author: haotang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 22:54:41

^ 1.[any].[any] (najnowsza wersja minor)
~ iz 1.2.[any] (najnowszy patch)

Wielką lekturą jest ten wpis na blogu o tym, jak semver stosuje się do npm
i co robią, aby pasował do standardu semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0

 34
Author: Will Stern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-15 18:07:07

~ tylda:

  • ~ liczebniki główne i podrzędne.
  • jest używany, gdy jesteś gotowy do zaakceptowania poprawek błędów w zależności, ale nie chcę żadnych potencjalnie niezgodnych zmian.
  • tylda pasuje do najnowszej wersji minor (numer środkowy).
  • ~ 1.2.3 pasuje do wszystkich 1.2.wersji x, ale zabraknie 1.3.0.
  • Tilde ( ~ ) daje Ci poprawki błędów

^ Caret:

  • ^ zamraża tylko numer główny.
  • jest używany, gdy uważnie obserwujesz swoje zależności i jesteś gotowy do szybkiej zmiany kodu, jeśli moll release będzie niekompatybilny.
  • zaktualizuje cię do najnowszej głównej wersji (pierwszy numer).
  • ^1.2.3 pasuje do dowolnego 1.wydanie X. X w tym 1.3.0, ale wstrzyma się z 2.0.0.
  • Caret ( ^ ) daje również kompatybilną wstecz nową funkcjonalność.
 31
Author: Laxmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-01 17:08:09

Dopasowanie kapelusza może być uznane za "złamane", ponieważ nie zaktualizuje ^0.1.2 do 0.2.0. Gdy pojawi się oprogramowanie, użyj wersji 0.x.y, a dopasowanie hat będzie pasować tylko do ostatniej zmiennej cyfry (y). Robi się to celowo. Powodem jest to, że podczas gdy oprogramowanie ewoluuje, API zmienia się szybko: jednego dnia masz te metody, a drugiego dnia masz te metody, a stare zniknęły. Jeśli nie chcesz łamać kodu osobom, które już korzystają z twojej Biblioteki, idź i zwiększ wersję główną: np. 1.0.0 -> 2.0.0 -> 3.0.0. Tak więc, zanim twoje oprogramowanie będzie w 100% gotowe i w pełni funkcjonalne, będzie to jak wersja 11.0.0 i to nie wygląda zbyt sensownie, a w rzeczywistości wygląda myląco. Jeśli natomiast używałeś 0.1.x -> 0.2.x -> 0.3.x wersje następnie do czasu, gdy oprogramowanie jest w 100% gotowe i w pełni funkcjonalny jest wydany jako wersja 1.0.0 i oznacza to, że " to wydanie jest usługą długoterminową, możesz kontynuować i korzystać z tej wersji Biblioteka w Twoim kodzie produkcyjnym, a autor nie zmieni wszystkiego jutro, czy za miesiąc, i nie porzuci pakietu".

Reguła jest następująca: używaj wersji 0.x.y, Gdy twoje oprogramowanie jeszcze nie dojrzało i wypuszczaj ją z rosnącą środkową cyfrą, gdy zmieni się Twoje publiczne API (dlatego osoby posiadające ^0.1.0 nie otrzymają aktualizacji 0.2.0 i nie złamie ich kodu). Następnie, gdy oprogramowanie dojrzeje, zwolnij go pod 1.0.0 i zwiększ lewą cyfrę za każdym razem, gdy twoje publiczne Zmiany w API (dlatego osoby posiadające ^1.0.0 nie otrzymają aktualizacji 2.0.0 i nie złamie ich kodu).

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.
 30
Author: catamphetamine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-23 11:56:25

Tylda ~ pasuje do wersji minor, jeśli masz zainstalowany pakiet, który ma 1.4.2 i po instalacji, wersje 1.4.3 i 1.4.4 są również dostępne, jeśli w pakiecie.json jest używany jako ~1.4.2 następnie npm install w Twoim projekcie po aktualizacji zainstaluje 1.4.4 w Twoim projekcie. Ale jest 1.5.0 dostępne dla tego pakietu, to nie będzie zainstalowany przez ~. Jest to tzw. wersja minor.

Caret ^ pasuje do głównej wersji, jeśli pakiet 1.4.2 jest zainstalowany w Twoim projekt i po instalacji 1.5.0 zostanie wydany wtedy ^ zainstaluje główną wersję. Nie pozwoli zainstalować 2.1.0 jeśli masz ^1.4.2.

Fixed version jeśli nie chcesz zmieniać wersji pakietu przy każdej instalacji, użyj fixed version bez żadnych znaków specjalnych np. "1.4.2"

Najnowsza Wersja * Jeśli chcesz zainstalować najnowszą wersję, użyj tylko * przed nazwą pakietu.

 19
Author: Mudassir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-22 09:24:55

One liner explanation

Standardowy system wersjonowania jest ważny.drobne.build (np. 2.4.1)

Npm sprawdza i naprawia wersję danego pakietu na podstawie tych znaków

~ : wersja główna jest stała, wersja poboczna jest stała, pasuje do dowolnego numeru kompilacji

np.: ~2.4.1 oznacza, że sprawdzi 2.4.X gdzie x jest czymkolwiek

^ : wersja główna jest poprawiona, pasuje do każdej wersji pobocznej, dopasowuje dowolny numer budowy

np.: ^2.4.1 oznacza, że sprawdzi 2.x. X gdzie x jest czymkolwiek

 16
Author: Avinash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 08:00:06

Prawdopodobnie widziałeś tyldę ( ~ ) i karetkę ( ^ ) w pakiecie.json. Jaka jest między nimi różnica?

Gdy wykonasz npm install moment --save, zapisuje on wpis w pakiecie.json z prefiksem caret ( ^ ).

Tylda (~)

W najprostszych słowach tylda ( ~ ) pasuje do najnowszej wersji podrzędnej (numer środkowy). ~1.2.3 pasuje do wszystkich 1.2.wersji x, ale zabraknie 1.3.0.

The caret (^)

Karetka ( ^ ) z drugiej strony jest bardziej zrelaksowany. Zaktualizuje Cię do najnowszej wersji głównej (pierwszy numer). ^1.2.3 będzie pasował do dowolnego 1.wydanie x. x w tym 1.3.0, ale wstrzyma się z 2.0.0.

Numer referencyjny: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b

 12
Author: Abdou Sameh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Semver jest podzielony na 3 główne sekcje, które są podzielone kropkami.

major.minor.patch
1.0.0

Te różne wersje major, minor i patch służą do identyfikacji różnych wydań. tide ( ~ ) i caret ( ^ ) używają do identyfikacji, która wersja podrzędna i łatkowa ma być używana w wersji pakietu.

~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
 5
Author: ireshika piyumalie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-27 08:52:21

Tilde (~)

Wersja główna jest stała, wersja poboczna jest stała, pasuje do każdej kompilacji Liczba

"express": "~4.13.3" 

~4.13.3 oznacza to, że sprawdzi 4.13.X gdzie x to cokolwiek i 4.14.0

Caret (^)

Wersja główna jest stała, pasuje do każdej wersji podrzędnej, pasuje do każdej kompilacji Liczba

"supertest": "^3.0.0"

^3.0.0 oznacza to, że sprawdzi 3.x. X gdzie x jest czymkolwiek

 4
Author: Farhan Yaseen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 12:21:06

Numer wersji jest w składni, która oznacza każdą sekcję o innym znaczeniu. składnia jest podzielona na trzy sekcje oddzielone kropką.

Major.drobne.patch 1.0.2

Major, minor I patch reprezentują różne wydania pakietu.

Npm używa tyldy (~) i caret ( ^ ), aby określić, która wersja poprawki i wersje podrzędne mają zostać użyte.

Więc jeśli widzisz ~1.0.2 oznacza to zainstalowanie wersji 1.0.2 lub najnowszej wersji patcha, takiej jak 1.0.4. Jeśli widzisz ^1.0.2 oznacza to zainstalowanie wersji 1.0.2 lub najnowszej wersji minor lub patch, takiej jak 1.1.0.

 2
Author: Rajashekhar Reddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 06:58:51

Carat ^ Dołącz wszystko większe niż konkretna wersja w tym samym głównym zakresie.

Tilde ~ Włącz wszystko większe niż konkretna wersja w tym samym zakresie molowym.

Na przykład, aby określić dopuszczalne zakresy wersji do 1.0.4, użyj następującej składni:

  • wydania patcha: 1.0 lub 1.0.x or ~1.0.4
  • drobne wydania: 1 lub 1.x lub ^1.0.4
  • ważniejsze wydania: * lub x

Aby uzyskać więcej informacji na temat składni wersjonowania semantycznego patrz npm SemVer calculator.

wersje semantyczne npm w publikowanych pakietach§

Więcej z dokumentacji npm o wersjonowaniu semantycznym

 2
Author: ElasticCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-01 11:43:55

Nie odpowiedź sama w sobie, ale spostrzeżenie, które wydaje się być przeoczone.

Opis dla zakresów karatowych:

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

Pozwala na zmiany, które nie modyfikują lewej-najbardziej niezerowej cyfry w tuple.

Oznacza, że ^10.2.3 pasuje 10.2.3 <= v < 20.0.0

Chyba nie o to im chodziło. W wersji 11.x. X do 19.x. X złamie Twoje kod.

Myślę, że mieli na myśli left most non-zero number field. W Semverze nie ma nic, co wymagałoby, aby pola liczbowe były jednocyfrowe.

 1
Author: Jesse Chisholm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-20 08:24:57

W związku z tym pytaniem możesz przejrzeć dokumentację Composera dotyczącą wersji, ale w skrócie:

  • Zakres wersji tyldy (~) - ~1.2.3 jest odpowiednikiem >=1.2.3 1.3.0
  • Zakres wersji karetki (^) - ~1.2.3 jest odpowiednikiem >=1.2.3 2.0.0

Zatem z tylda otrzymasz automatyczne aktualizacje łat, ale wersje minor I major nie będą aktualizowane. Jeśli jednak użyjesz Caret otrzymasz łatki i wersje Pomniejsze, ale nie otrzymasz wersji głównych (łamiących zmiany).

Wersja tyldy jest uważana za" bezpieczniejszą", ale jeśli używasz niezawodnych zależności (dobrze utrzymanych bibliotek), nie powinieneś mieć żadnych problemów z wersją Careta (ponieważ drobne zmiany nie powinny być przerywaniem zmian.

Powinieneś przejrzeć ten post stackoverflow o różnicach między instalacją composera a aktualizacją composera.

 1
Author: milan.latinovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-18 14:36:15

~ specfices to minor version releases ^ określa główne wydania wersji

Na przykład jeśli wersja pakietu to 4.5.2, przy aktualizacji ~4.5.2 zainstaluje najnowszą wersję 4.5.wersja x (wersja MINOR) ^4.5.2 zainstaluje Najnowszy 4.x. X version (MAJOR VERSION)

 0
Author: neeraj-dixit27,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 11:02:59