Po aktualizacji do najnowszej stabilnej wersji node
i npm
spróbowałem npm install moment --save
. Zapisuje wpis w prefiksie package.json
karetki ^
. Wcześniej był to ~
przedrostek tyldy .
- Dlaczego wprowadzono te zmiany
npm
? - Jaka jest różnica między tyldą
~
a karetką^
? - Jakie są zalety w stosunku do innych?
node.js
npm
package.json
semantic-versioning
Fizer Khan
źródło
źródło
npm config set save-prefix=''
. (Wstaw~
cytaty, jeśli tak wolisz.) Ja osobiście to robię i pakuję rzeczy do produkcji.Odpowiedzi:
Zobacz dokumenty NPM i dokumenty semver
~ wersja „W przybliżeniu odpowiednik wersji”, zaktualizuje cię do wszystkich przyszłych wersji łatek, bez zwiększania wersji dodatkowej.
~1.2.3
użyje wersji od 1.2.3 do <1.3.0.^ wersja „Kompatybilny z wersją”, zaktualizuje cię do wszystkich przyszłych mniejszych wersji / łatek, bez zwiększania wersji głównej.
^2.3.4
użyje wersji od 2.3.4 do <3.0.0.Zobacz komentarze poniżej.
źródło
^
lub a~
. Ustaw to, jeśli chcesz mieć ścisłą kontrolę nad swoimi wersjami:npm config set save-prefix=''
0.2.x
,2
nie jestmajor version
. Dlatego docs.npmjs.com stosować konkretne słowa:the left-most non-zero digit
. A co z tym przypadkiem: ^ 0,0.4 oznacza 0,0,4A
w 3 wersjach:0.0.1
,0.0.2
i0.0.3
. Wystąpił błąd,0.0.1
więc chcesz mieć przynajmniej0.0.2
w swoim pakiecieB
. Jeśli napiszesz0.0.x
, dostaniesz0.0.3
, co jest OK. Ale jeśli jakiś inny pakietC
wymaga obu,B
aA
dodatkowo ma ograniczenia"A": "<0.0.2"
, dostaniesz je0.0.1
bez pokazywania problemu konfliktu, co nie jest tym, czego chcesz. Użycie tyldy~0.0.2
powinno pomóc uniknąć tego problemu.Chciałbym również dodać oficjalną dokumentację npmjs, która opisuje wszystkie metody specyficzności 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 npm semver - Tilde Ranges & semver (7)^version
„Kompatybilny z wersją” Patrz npm semver - Caret Ranges & semver (7)version
Musi dokładnie pasować do wersji>version
Musi być większy niż wersja>=version
itp<version
<=version
1.2.x
1.2.0, 1.2.1 itd., Ale nie 1.3.0http://sometarballurl
(może to być adres URL tarballa, który zostanie pobrany i zainstalowany lokalnie*
Pasuje do dowolnej wersjilatest
Otrzymuje najnowszą wersjęPowyższa lista nie jest wyczerpująca. Inne specyfikatory wersji obejmują adresy URL GitHub i repozytorium użytkowników GitHub, lokalne ścieżki i pakiety ze specyficznymi tagami npm
źródło
1.2.0 || >=1.2.2 <1.3.0
: Dokładnie 1.2.0 lub wszystko od 1.2.2 do 1.3.0 (włącznie), ale nie 1.2.1 lub 1.3.1 i wyżej, a także nie 1.1 .x i poniżej."Approximately equivalent to version"
i"Compatible with version"
są tak frustrująco niespecyficznymi sposobami opisywania zachowania ~ i ^. Dziękuję @jgillich za udzielenie rzeczywistej odpowiedzi!npm pozwala na zainstalowanie nowszej wersji pakietu niż podana. Użycie tilde (
~
) daje ci poprawki błędów, a caret (^
) daje także nową kompatybilność wsteczną.Problem polega na tym, że stare wersje zwykle nie otrzymują zbyt wiele poprawek, więc npm używa
^
domyślnie caret ( )--save
.Według: „Semver wyjaśnił - dlaczego w mojej paczce.json jest znak karetki (^)?” .
Należy pamiętać, że reguły dotyczą wersji powyżej 1.0.0 i nie każdy projekt jest zgodny z wersją semantyczną. W wersjach 0.xx daszek dopuszcza tylko aktualizacje łatek , tzn. Zachowuje się tak samo jak tylda. Zobacz „Zakresy Caret”
Oto wizualne wyjaśnienie pojęć:
Źródło: „Semantyczna wersja Cheatheet” .
źródło
Semver
Zezwalaj lub nie zezwalaj na zmiany
1.2.3
.^
(jak głowa). Umożliwia aktualizacje na drugim niezerowym poziomie od lewej:^0.2.3
oznacza0.2.3 <= v < 0.3
.~
(jak ogon). Zasadniczo zamroź poziom najbardziej w prawo lub ustaw zero, jeśli zostanie pominięty:~1
znaczy1.0.0 <= v < 2.0.0
~1.2
środki1.2.0 <= v < 1.3.0
.~1.2.4
środki1.2.4 <= v < 1.3.0
.0.2
oznacza0.2 <= v < 1
. Różni się od~
:0
Wszystkie (miejmy nadzieję) możliwości
Ustaw początkowy poziom główny i zezwalaj na aktualizacje w górę
Zatrzymaj główny poziom
Zablokuj mniejszy poziom
Zatrzymaj poziom łaty
Nie zezwalaj na aktualizacje
Uwaga : brakujące dane główne, drobne, poprawki lub specyfikacje
beta
bez numeru jest takie samo jakany
dla brakującego poziomu.Uwaga : Po zainstalowaniu pakietu, który ma
0
poziom główny, aktualizacja zainstaluje tylko nową wersję beta / pr! To dlatego, żenpm
zestawy^
sąpackage.json
ustawione domyślnie w, a wersja zainstalowana jest podobna0.1.3
, zamraża wszystkie poziomy główne / drobne / poprawki.źródło
~
naprawia duże i mniejsze liczby. Jest używany, gdy jesteś gotowy zaakceptować poprawki błędów w swojej 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 drobne wydanie będzie niezgodne.Ponadto nie
^
jest obsługiwany przez starsze wersje npm i należy go używać ostrożnie.Tak więc
^
jest dobrym domyślnym, ale nie jest doskonały. Sugeruję staranne wybranie i skonfigurowanie najbardziej przydatnego dla ciebie operatora semver.źródło
~
: Dość blisko do^
: Kompatybilny zźródło
^0.1.3
akceptuje tylko wersje0.1.x
i nie akceptuje0.2.0
, nawet jeśli jest to niewielki przyrost. To zachowanie jest równoważne z~0.1.3
. Przyczyna tego zachowania wynika z faktu, że pakiety zerowania są nadal uważane za niestabilne; słowami semver.org , nr 4, „wszystko może się zmienić w dowolnym momencie” (w tym zmiany niezgodne wstecz).^
to 1. [dowolne]. [dowolne] (najnowsza wersja pomocnicza)~
to 1.2. [dowolne] (najnowsza łatka)Świetnie przeczytano ten post na blogu, w jaki sposób semver odnosi się do npm
i co robią, aby dopasować go do standardu semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0
źródło
Dopasowywanie kapelusza można uznać za „zepsute”, ponieważ nie zostanie zaktualizowane
^0.1.2
do0.2.0
. Kiedy pojawi się oprogramowanie, użyj0.x.y
wersji i dopasowuj hat dopasuje tylko ostatnią zmienną cyfrę (y
). Odbywa się to celowo. Powodem jest to, że gdy oprogramowanie ewoluuje, interfejs API zmienia się gwałtownie: pewnego dnia masz te metody, a drugiego masz te metody i starych już nie ma. 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 będzie w pełni funkcjonalne, będzie to jak wersja,11.0.0
która nie będzie wyglądać na znaczącą i faktycznie będzie myląca. Jeśli natomiast używałeś0.1.x
->0.2.x
->0.3.x
wersje, zanim oprogramowanie zostanie w 100% gotowe i będzie w pełni funkcjonalne, zostanie wydane jako wersja,1.0.0
co oznacza: „To wydanie jest usługą długoterminową, możesz kontynuować korzystanie z tej wersji biblioteki w swojej produkcji kodu, a autor nie zmieni wszystkiego jutro lub w przyszłym miesiącu i nie porzuci pakietu ".Zasada jest taka: używaj
0.x.y
wersji, gdy oprogramowanie nie jest jeszcze dojrzałe, i zwolnij ją, zwiększając środkową cyfrę, gdy zmienia się publiczny interfejs API (dlatego osoby,^0.1.0
które nie otrzymają0.2.0
aktualizacji i nie złamią swojego kodu). Następnie, gdy oprogramowanie dojrzeje, zwolnij go1.0.0
i zwiększaj lewą cyfrę za każdym razem, gdy zmienia się twój publiczny interfejs API (dlatego ludzie^1.0.0
nie otrzymają2.0.0
aktualizacji i nie złamie ich kodu).źródło
~ Tylda:
~
zawiesza liczby większe i mniejsze.^ Caret:
^
zamraża tylko numer główny.źródło
Tilde ~ pasuje do mniejszej wersji, jeśli zainstalowałeś pakiet, który ma 1.4.2, a 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, a następnie instalacja npm w twoim projekcie po aktualizacji zainstaluje 1.4.4 w twoim projekcie. Ale dla tego pakietu jest dostępna wersja 1.5.0, więc nie zostanie on zainstalowany przez ~. Nazywa się to wersją podrzędną.
Caret ^ pasuje do głównej wersji, jeśli pakiet 1.4.2 jest zainstalowany w twoim projekcie, a po wydaniu instalacji 1.5.0, ^ zainstaluje główną wersję. Nie pozwoli zainstalować 2.1.0, jeśli masz ^ 1.4.2 .
Naprawiono wersję, jeśli nie chcesz zmieniać wersji pakietu przy każdej instalacji, a następnie użyłeś stałej wersji bez żadnego znaku specjalnego, np. „1.4.2”
Najnowsza wersja * Jeśli chcesz zainstalować najnowszą wersję, używaj * tylko przed nazwą pakietu.
źródło
Objaśnienie jednego linera
Standardowy system wersjonowania to major.minor.build (np. 2.4.1)
npm sprawdza i naprawia wersję konkretnego pakietu na podstawie tych znaków
np .: ~ 2.4.1 oznacza, że sprawdzi, czy 2.4.x gdzie x jest cokolwiek
np .: ^ 2.4.1 oznacza, że sprawdzi 2.xx gdzie x jest czymkolwiek
źródło
Prawdopodobnie widziałeś tyldę (~) i karetkę (^) w pliku package.json. Jaka jest różnica między nimi?
Kiedy wykonasz npm moment instalacji --save, zapisuje on wpis w pliku package.json z prefiksem daszka (^).
Tylda (~)
Mówiąc najprościej, tylda (~) odpowiada najnowszej wersji dodatkowej (środkowej liczbie). ~ 1.2.3 pasuje do wszystkich wersji 1.2.x, ale brakuje wersji 1.3.0.
Karetka (^)
Natomiast daszek (^) jest bardziej zrelaksowany. Spowoduje to zaktualizowanie do najnowszej wersji głównej (pierwszy numer). ^ 1.2.3 będzie pasować do dowolnej wersji 1.xx, w tym 1.3.0, ale wstrzyma się z wersją 2.0.0.
Odniesienie: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b
źródło
semver jest podzielony na 3 główne sekcje, które są podzielone kropkami.
Te różne główne, drobne i łatki służą do identyfikacji różnych wydań. tide (~) i caret (^) używają do określenia, która wersja pomocnicza i łatka ma być używana w wersji pakietu.
źródło
Tylda (~)
~4.13.3
oznacza, że sprawdzi 4.13.x gdzie x jest czymkolwiek i 4.14.0Caret (^)
^3.0.0
oznacza, że sprawdzi 3.xx gdzie x jest czymkolwiekźródło
Numer wersji ma składnię, która oznacza każdą sekcję o innym znaczeniu. składnia jest podzielona na trzy sekcje oddzielone kropką.
major.minor.patch 1.0.2
Major, minor i patch reprezentują różne wersje pakietu.
npm używa tyldy (~) i karetki (^) do określenia, której łatki i mniejszych wersji użyć.
Jeśli więc zobaczysz ~ 1.0.2, oznacza to zainstalowanie wersji 1.0.2 lub najnowszej wersji poprawki, takiej jak 1.0.4. Jeśli zobaczysz ^ 1.0.2, oznacza to zainstalowanie wersji 1.0.2 lub najnowszej wersji podrzędnej lub łatki, takiej jak 1.1.0.
źródło
karat
^
obejmuje wszystko większe niż konkretna wersja z tego samego głównego zakresu.tylda
~
obejmuje wszystko większe niż konkretna wersja z tego samego pomniejszego zakresu.Na przykład, aby określić dopuszczalne zakresy wersji do 1.0.4, użyj następującej składni:
Aby uzyskać więcej informacji na temat składni wersjonowania semantycznego, zobacz kalkulator npm semver .
Więcej z dokumentacji npm O wersjach semantycznych
źródło
Nie jest to odpowiedź sama w sobie, ale spostrzeżenie, które wydaje się być przeoczone.
Opis zakresów karatowych:
patrz: https://github.com/npm/node-semver#caret-ranges-123-025-004
Oznacza, że
^10.2.3
pasuje10.2.3 <= v < 20.0.0
Nie sądzę, że o to im chodziło. Pobieranie wersji od 11.xx do 19.xx spowoduje uszkodzenie kodu.
Myślę, że mieli na myśli
left most non-zero number field
. W SemVer nie ma nic, co wymagałoby jednocyfrowego pola liczbowego.źródło
~ specyfikacje dla mniejszych wydań wersji ^ określa dla głównych wydań wersji
Na przykład, jeśli wersja pakietu to 4.5.2, przy aktualizacji ~ 4.5.2 zainstaluje najnowszą wersję 4.5.x (WERSJA MNIEJSZA) ^ 4.5.2 zainstaluje najnowszą wersję 4.xx (WERSJA MAJOR)
źródło
W związku z tym pytaniem możesz przejrzeć dokumentację Composer dotyczącą wersji , ale w skrócie:
Tak więc, dzięki Tilde będziesz otrzymywać automatyczne aktualizacje łat, ale mniejsze i większe wersje nie będą aktualizowane. Jednakże, jeśli użyjesz Caret , dostaniesz łatki i mniejsze wersje, ale nie dostaniesz głównych (przełamujących zmiany) wersji.
Wersja Tilde 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ą Caret (ponieważ drobne zmiany nie powinny niszczyć zmian.
Prawdopodobnie powinieneś zapoznać się z tym postem dotyczącym przepływu stosu na temat różnic między instalacją kompozytora a aktualizacją kompozytora .
źródło