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 ~
.
- dlaczego te zmiany są wprowadzane w
npm
? - Jaka jest różnica między tyldą
~
a caretem^
? - jakie są zalety nad innymi?
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
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
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
.
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ęć:
Źródło: "Semantic Versioning Cheatsheet" .
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
oznacza0.2.3 <= v < 0.3
. - Użyj
~
(jak ogon). Zazwyczaj zamrozić prawo-najbardziej poziom lub ustawić zero, jeśli pominięte: -
~1
oznacza1.0.0 <= v < 2.0.0
-
~1.2
oznacza1.2.0 <= v < 1.3.0
. -
~1.2.4
oznacza1.2.4 <= v < 1.3.0
. - Ommit right-most level:
0.2
oznacza0.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.
- wyjściowa pominięta wersja poziomu jest zawsze
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.
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.
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
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
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ść.
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.
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.
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
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
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
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
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.
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.
Więcej z dokumentacji npm o wersjonowaniu semantycznym
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
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.
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.
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)
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