Qual è la differenza tra tilde (~) e caret (^) in package.json?


3388

Dopo che ho aggiornato a più stabile nodee npm, ho provato npm install moment --save. Salva la voce nel package.jsoncon il ^prefisso caret . In precedenza, era un ~prefisso tilde .

  1. Perché vengono apportate queste modifiche npm?
  2. Qual'è la differenza tra tilde ~e caret ^?
  3. Quali sono i vantaggi rispetto agli altri?

42
FYI è possibile evitare i prefissi o utilizzare uno personalizzato facendo: npm config set save-prefix=''. (Rimani ~tra le virgolette se è quello che preferisci.) Lo faccio personalmente e mi restringo per le cose in produzione.
fncomp

19
Tutti i dettagli grintosi di come funzionano tilde e caret e le differenze: github.com/npm/node-semver#tilde-ranges-123-12-1
Jeffrey Martinez

11
Questo strumento è di grande aiuto per testare semver.npmjs.com
chaiyachaiya,

@fncomp volevo solo chiarire se ho ricevuto il tuo commento giusto .. usi solo versioni specifiche di dipendenze nel tuo progetto? il nostro team è riluttante ad aggiornare le dipendenze .. consiglieresti di utilizzare versioni specifiche o il prefisso '~' per le dipendenze ..?
blogs4t

@fncomp potresti per favore dettagliare cosa intendi dicendo "Personalmente faccio questo e rimpicciolisco per le cose in produzione". Grazie!
blog4t

Risposte:


3849

Vedi i documenti NPM e i documenti semver :

  • ~ versione "Approssimativamente equivalente alla versione", ti aggiornerà a tutte le future versioni di patch, senza incrementare la versione minore. ~1.2.3utilizzerà le versioni da 1.2.3 a <1.3.0.

  • ^ versione "Compatibile con la versione", ti aggiornerà a tutte le future versioni minori / patch, senza incrementare la versione principale. ^2.3.4utilizzerà le versioni da 2.3.4 a <3.0.0.

Vedere i commenti di seguito per le eccezioni, in particolare per le versioni precedenti, come ^ 0.2.3


325
Pubblicare qui per spero di catturare persone che non ci pensano bene, ma sia ^ che ~ presumono che tu possa fidarti delle versioni minori e puntuali delle tue dipendenze. Se stai pubblicando una biblioteca e desideri che altre persone si fidino di te, NON ACCETTARE CIECAMENTE LE DIPENDENZE DAL DOWNSTREAM. Un brutto rilascio di punti dalla tua dipendenza può causare una reazione a catena a monte e farà bussare alla tua porta quando le cose andranno a forma di pera. Questa è un'altra grande ragione per usare il nink shrinkwrap sul tuo codice di produzione.
Tehfoo,

8
Puoi anche eliminare tutte le assurdità di npm che antepone le tue versioni con a ^o a ~. Impostalo se vuoi avere uno stretto controllo sulle tue versioni: npm config set save-prefix=''
kumarharsh

5
@prasanthv ha ragione: da docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0 .4. Consente modifiche che non modificano la cifra diversa da zero più a sinistra nella tupla [maggiore, minore, patch]. In altre parole, ciò consente aggiornamenti di patch e minori per le versioni 1.0.0 e successive, aggiornamenti di patch per le versioni 0.X> = 0.1.0 e nessun aggiornamento per le versioni 0.0.X.
rofrol,

16
@jgillich in semver quando lo usi 0.2.x, 2non è un major version. Ecco perché docs.npmjs.com usato le parole specifiche: the left-most non-zero digit. Anche per quanto riguarda questo caso: ^ 0.0.4 significa 0.0.4
rofrol

11
@FagnerBrack: l'esempio specifico che hai fornito è corretto, ma generalmente il tuo modo di pensare è sbagliato. Un esempio: Diciamo che avete il pacchetto Ain 3 versioni: 0.0.1, 0.0.2e 0.0.3. C'è un bug in 0.0.1modo che tu voglia avere almeno 0.0.2nel tuo pacchetto B. Se scrivi 0.0.xotterrai 0.0.3, il che è OK. Ma se qualche altro pacchetto Crichiede entrambi Be Aha anche un vincolo "A": "<0.0.2", otterrai 0.0.1senza mostrare alcun problema di conflitto, che non è quello che vuoi. L'uso di tilde ~0.0.2dovrebbe aiutarti a evitare questo problema.
Maciej Sz,

863

Vorrei aggiungere anche la documentazione ufficiale di npmjs che descrive tutti i metodi per la specificità della versione inclusi quelli a cui si fa riferimento nella domanda -

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

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

  • ~version"Approssimativamente equivalente alla versione" Vedi npm semver - Tilde Ranges & semver (7)
  • ^version"Compatibile con la versione" Vedi npm semver - Caret Ranges & semver (7)
  • version Deve corrispondere esattamente alla versione
  • >version Deve essere maggiore della versione
  • >=version eccetera
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1, ecc., Ma non 1.3.0
  • http://sometarballurl (questo potrebbe essere l'URL di un tarball che verrà scaricato e installato localmente
  • * Abbina qualsiasi versione
  • latest Ottiene l'ultima versione

L'elenco sopra non è esaustivo. Altri identificatori di versione includono URL GitHub e repository utente GitHub, percorsi locali e pacchetti con tag npm specifici


8
È anche possibile specificare un intervallo esatto di versioni, come 1.2.0 || >=1.2.2 <1.3.0: esattamente 1.2.0 o qualsiasi cosa da 1.2.2 a 1.3.0 (incluso), ma non 1.2.1 o 1.3.1 e versioni successive e anche non 1.1 .xe inferiore.
CodeManX,

Un link più specifico da quanto sopra -> docs.npmjs.com/files/package.json#dependencies
Toby

"Approximately equivalent to version"e "Compatible with version"sono modi così frustranti e non specifici per descrivere il comportamento ~ e ^. Grazie @jgillich per aver fornito una risposta effettiva!
Scott Stafford,

636

npm consente l'installazione di una versione più recente di un pacchetto rispetto a quella specificata. L'uso di tilde ( ~) ti dà rilasci di bug fix e caret ( ^) ti dà anche nuove funzionalità compatibili con le versioni precedenti.

Il problema è che le vecchie versioni di solito non ricevono così tante correzioni di bug, quindi npm usa caret ( ^) come predefinito per --save.

tabella semver

Secondo: "Semver ha spiegato - perché c'è un cursore (^) nel mio package.json?" .

Si noti che le regole si applicano alle versioni precedenti alla 1.0.0 e non tutti i progetti seguono il controllo delle versioni semantico. Per le versioni 0.xx il cursore consente solo gli aggiornamenti delle patch , ovvero si comporta come la tilde. Vedi "Caret Ranges"

Ecco una spiegazione visiva dei concetti:

diagramma semver

Fonte: "Cheatsheet di versione semantica" .


2
Che dire di ^ 0.2.5? da docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Consente modifiche che non modificano la cifra diversa da zero più a sinistra nella tupla [maggiore, minore, patch]. In altre parole, ciò consente aggiornamenti di patch e minori per le versioni 1.0.0 e successive, aggiornamenti di patch per le versioni 0.X> = 0.1.0 e nessun aggiornamento per le versioni 0.0.X.
rofrol,

11
@rofrol qualsiasi versione precedente alla 1.0.0 è considerata instabile e queste regole non si applicano
pspi

2
Quindi la tua spiegazione non è completa
rofrol

5
@rofrol sì, a volte omettere la leggibilità è buono, le possibilità di avere qualcosa sotto 1.0.0 per una dipendenza nel pacchetto json sono piuttosto basse. vedi anche il principio 20/80, è un'ottima regola per concentrarsi su ciò che conta
pspi il

1
@pspi Avere versioni inferiori alla 1.0.0 è "improbabile"? Su 60 abbiamo ~ 15, e la maggior parte di loro non sono oscuri.
Dave Newton,

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Utilizzare il calcolatore sempm npm per i test. (Sebbene le spiegazioni per ^ (includa tutto ciò che è maggiore di una determinata versione nello stesso intervallo principale) e ~ (includa tutto ciò che è maggiore di una versione particolare nello stesso intervallo minore) non siano corrette al 100%, la calcolatrice sembra funzionare correttamente )
  • In alternativa, utilizzare SemVer Check , che non richiede di scegliere un pacchetto e offre anche spiegazioni.

Consentire o impedire modifiche

  • Versione Pin: 1.2.3.
  • Usa ^(come la testa). Consente aggiornamenti al secondo livello diverso da zero da sinistra: ^0.2.3significa 0.2.3 <= v < 0.3.
  • Usa ~(come la coda). Blocca generalmente il livello più a destra o imposta zero se omesso:
    • ~1 si intende 1.0.0 <= v < 2.0.0
    • ~1.2significa 1.2.0 <= v < 1.3.0.
    • ~1.2.4significa 1.2.4 <= v < 1.3.0.
  • Ommit livello più a destra: 0.2significa 0.2 <= v < 1. Differisce da ~perché:
    • L'avvio della versione di livello omesso è sempre 0
    • È possibile impostare l'avvio della versione principale senza specificare i livelli secondari.

Tutte (possibilmente) possibilità

Impostare l'avvio a livello principale e consentire gli aggiornamenti verso l'alto

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

Congelare il livello principale

~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

Blocco di livello secondario

^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

Congela a livello di patch

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

Non consentire aggiornamenti

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Avviso : mancante maggiore, minore, patch o specifica betasenza numero, è lo stesso anydel livello mancante.

Avviso : quando installi un pacchetto che ha 0il livello principale, l'aggiornamento installerà solo la nuova versione del livello beta / pr! Questo perché npmimposta ^come predefinito in package.jsone quando la versione installata è simile 0.1.3, congela tutti i livelli principali / minori / patch.


Dire alle persone di evitare di avviare progetti da 0 perché gli sviluppatori di librerie e consumatori non comprendono il sistema è una soluzione terribile. Penso che @asdfasdfads abbia informazioni molto migliori.
ProLoser,

@ProLoser Penso solo che il sistema dovrebbe essere semplificato e non dovremmo usare le versioni 0.x.
Rofrol,

1
Il caso d'uso relativo allo sviluppo del ciclo di vita iniziale e v0 ha molto senso. Imparare come v0 si comporta correttamente mi ha fatto davvero guardare avanti ad altri progetti del ciclo di vita iniziale. Significa che puoi avere un'API che cambia rapidamente con molte incompatibilità all'indietro senza essere costretto a dichiarare il tuo progetto come 1.x (aka: stable) quando non lo è.
ProLoser,

Lo capisco, ma non mi piace come funziona con semver e qualificazioni
rofrol,

2
Sembra più un'opinione e non dovrebbe essere inquadrato come un approccio generalmente accettato. E ^ 0.1.x ottiene le patch perfettamente bene.
ProLoser,

93

~corregge numeri maggiori e minori. Viene utilizzato quando si è pronti ad accettare correzioni di errori nella propria dipendenza, ma non si desidera apportare modifiche potenzialmente incompatibili.

^corregge solo il numero principale. Viene utilizzato quando si osservano da vicino le proprie dipendenze e si è pronti a modificare rapidamente il codice se la versione minore sarà incompatibile.

Inoltre, non^ è supportato dalle vecchie versioni di npm e deve essere usato con cautela.

Quindi, ^è un buon default, ma non è perfetto. Suggerisco di scegliere con cura e configurare l'operatore semver che ti è più utile.


13
non vero: Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Consente modifiche che non modificano la cifra diversa da zero più a sinistra nella tupla [maggiore, minore, patch]. In altre parole, ciò consente aggiornamenti di patch e minori per le versioni 1.0.0 e successive, aggiornamenti di patch per le versioni 0.X> = 0.1.0 e nessun aggiornamento per le versioni 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

6
Questa risposta è completamente sbagliata (come molti altri qui). Nessuno di questi ha mai risolto un numero importante! Come diceva @rofrol, ^ mantiene invariata la cifra più a zero della cifra sinistra. ~ d'altra parte consente solo aggiornamenti di patch se viene specificata la versione secondaria (ad es. ~ 1.2.3 o ~ 1.2) e consente aggiornamenti minori se non viene specificata la versione secondaria (ad es. ~ 1).
TheBaj

2
@TheBaj Significano "fix" come "define" ("fixate") piuttosto che "aggiustare", quindi siete tutti d'accordo su come viene gestito il numero maggiore.
maaartinus,

1
Sì, questa risposta mi è sembrata totalmente all'indietro fino a quando ho capito che il risponditore significava "correzione" come in "rendere fisso, fisso o immutabile".
NattyC,

57

~: Ragionevolmente vicino a

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: Compatibile con

   ^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 - no. Nel caso speciale dei numeri di versione con rilascio di zeroth, il carato equivale alla tilde. Quindi ^0.1.3accetta solo le versioni 0.1.xe non accetterà 0.2.0, anche se si tratta di un incremento minore. Questo comportamento è equivalente a ~0.1.3. Il ragionamento alla base di questo comportamento è dovuto al fatto che i pacchetti di rilascio di zeroth sono ancora considerati instabili; nelle parole di semver.org , n. 4, "tutto può cambiare in qualsiasi momento" (compresi i cambiamenti incompatibili all'indietro).
Chharvey,

31

^è 1. [qualsiasi]. [qualsiasi] (ultima versione minore)
~è 1.2. [qualsiasi] (ultima patch)

Una buona lettura è questo post sul blog su come si applica semver a npm
e cosa stanno facendo per farlo corrispondere allo standard semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0


2
non vero: Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. Consente modifiche che non modificano la cifra diversa da zero più a sinistra nella tupla [maggiore, minore, patch]. In altre parole, ciò consente aggiornamenti di patch e minori per le versioni 1.0.0 e successive, aggiornamenti di patch per le versioni 0.X> = 0.1.0 e nessun aggiornamento per le versioni 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

28

Cappello di corrispondenza può essere considerato "spezzato" perché non ci vorrà modificare ^0.1.2a 0.2.0. Quando il software sta emergendo, utilizzare le 0.x.yversioni e la corrispondenza del cappello corrisponderanno solo all'ultima cifra variabile ( y). Questo è fatto apposta. Il motivo è che mentre il software si sta evolvendo l'API cambia rapidamente: un giorno hai questi metodi e l'altro giorno hai quei metodi e quelli vecchi se ne sono andati. Se non vuoi rompere il codice per le persone che stanno già utilizzando la tua libreria, vai e incrementa la versione principale: ad es. 1.0.0-> 2.0.0-> 3.0.0. Quindi, quando il tuo software sarà finalmente completo al 100% e pieno di funzionalità, sarà come una versione 11.0.0e questo non sembra molto significativo e in realtà sembra confuso. Se lo fosse, invece, usi 0.1.x->0.2.x-> 0.3.xversioni quindi quando il software è finalmente completo al 100% e full-optional viene rilasciato come versione 1.0.0e significa "Questa versione è di lunga durata, puoi procedere e utilizzare questa versione della libreria nella tua produzione codice e l'autore non cambierà tutto domani o il mese prossimo e non abbandonerà il pacchetto ".

La regola è: usa il controllo delle 0.x.yversioni quando il tuo software non è ancora maturato e rilascialo con l'incremento della cifra media quando l'API pubblica cambia (quindi le persone che ^0.1.0non avranno l' 0.2.0aggiornamento e non romperanno il loro codice). Quindi, quando il software matura, rilascialo sotto 1.0.0e incrementa la cifra più a sinistra ogni volta che cambia l'API pubblica (quindi le persone che ^1.0.0non avranno l' 2.0.0aggiornamento e non romperanno il loro codice).

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.

Questo commento è stato ridicolmente utile e non sembra essere documentato molto bene. Hai un link alla documentazione relativa a questo comportamento? Questa risposta sui progetti v0 mi ha aiutato molto.
ProLoser,

Non ho un link: ho trovato anche queste informazioni cercando su Google e giocando con la calcolatrice della versione semantica npm semver.npmjs.com
catamphetamine,

2
Deve essere aggiunto alla loro documentazione in modo più formale. Ho tenuto un discorso alla Sony con il mio team di ingegneri perché sembra essere facilmente trascurato. slides.com/proloser/semver-v0
ProLoser

24

~ Tilde:

  • ~congela i numeri maggiori e minori.
  • Viene utilizzato quando si è pronti ad accettare correzioni di errori nella propria dipendenza, ma non si desidera apportare modifiche potenzialmente incompatibili.
  • La tilde corrisponde alla versione minore più recente (il numero medio).
  • ~ 1.2.3 corrisponderà a tutte le versioni 1.2.x, ma mancherà 1.3.0.
  • Tilde (~) ti dà le versioni di correzione dei bug

^ Caret:

  • ^ blocca solo il numero principale.
  • Viene utilizzato quando si osservano da vicino le proprie dipendenze e si è pronti a modificare rapidamente il codice se la versione minore sarà incompatibile.
  • Ti aggiornerà alla versione principale più recente (il primo numero).
  • ^ 1.2.3 corrisponderà a qualsiasi versione 1.xx inclusa 1.3.0, ma rimarrà bloccata su 2.0.0.
  • Caret (^) offre anche nuove funzionalità compatibili con le versioni precedenti.

1
La tilde corrisponde alla versione della patch più recente (l'ultimo numero). Il cursore corrisponde alla versione minore più recente (il numero medio).
Abdul Rauf,

"congela" è la migliore spiegazione.
mhrabiee,

Caret blocca entrambi il numero principale e ti aggiornerà alla versione principale più recente (il primo numero)? Il numero principale è il primo numero, quindi non ha senso.
NattyC,

19

Tilde ~ corrisponde alla versione secondaria, se hai installato un pacchetto che ha 1.4.2 e dopo l'installazione, sono disponibili anche le versioni 1.4.3 e 1.4.4 se nel tuo pacchetto. Json è usato come ~ 1.4.2 quindi npm install nel progetto dopo l'aggiornamento verrà installato 1.4.4 nel progetto. Ma è disponibile 1.5.0 per quel pacchetto, quindi non verrà installato da ~. Si chiama versione secondaria.

Caret ^ corrisponde alla versione principale, se il pacchetto 1.4.2 è installato nel progetto e dopo il rilascio dell'installazione 1.5.0, ^ installerà la versione principale. Non consentirà di installare 2.1.0 se si dispone di ^ 1.4.2 .

Versione fissa se non si desidera modificare la versione del pacchetto su ciascuna installazione, quindi utilizzare la versione fissa senza caratteri speciali, ad es. "1.4.2"

Ultima versione * Se si desidera installare l'ultima versione, utilizzare solo * davanti al nome del pacchetto.


3
Questa risposta è fuorviante. SemVer afferma chiaramente, un numero di versione normale DEVE assumere la forma XYZ [dove] X è la versione principale, Y è la versione minore e Z è la versione della patch.
Leone,

15

Una spiegazione di copertina

Il sistema di versione standard è major.minor.build (ad es. 2.4.1)

npm controlla e corregge la versione di un determinato pacchetto in base a questi caratteri

~ : la versione principale è fissa, la versione secondaria è fissa, corrisponde a qualsiasi numero di build

es: ~ 2.4.1 significa che controllerà 2.4.x dove x è qualcosa

^ : la versione principale è fissa, corrisponde a qualsiasi versione minore, corrisponde a qualsiasi numero di build

es: ^ 2.4.1 significa che controllerà 2.xx dove x è qualcosa


5
Vedo 7 righe in questa risposta
FluxLemur

11

Probabilmente hai visto tilde (~) e caret (^) in package.json. Qual'è la differenza tra loro?

Quando si esegue npm install moment --save, salva la voce in package.json con il prefisso caret (^).

La tilde (~)

In parole povere, la tilde (~) corrisponde alla versione minore più recente (il numero medio). ~ 1.2.3 corrisponderà a tutte le versioni 1.2.x ma mancherà 1.3.0.

The caret (^)

Il cursore (^), d'altra parte, è più rilassato. Ti aggiornerà alla versione principale più recente (il primo numero). ^ 1.2.3 corrisponderà a qualsiasi versione 1.xx inclusa 1.3.0, ma rimarrà disattivata su 2.0.0.

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


Ancora una volta, questa risposta è fuorviante. SemVer afferma chiaramente, un numero di versione normale DEVE assumere la forma XYZ [dove] X è la versione principale, Y è la versione minore e Z è la versione della patch.
Leone,

5

semver è separato in 3 sezioni principali che è rotto da punti.

major.minor.patch
1.0.0

Queste differenti major, minor e patch stanno usando per identificare diverse versioni. tide (~) e caret (^) stanno usando per identificare quale versione minore e patch usare nella versione del pacchetto.

~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

Tilde (~)

la versione principale è fissa, la versione secondaria è fissa, corrisponde a qualsiasi numero di build

"express": "~4.13.3" 

~4.13.3 significa che controllerà 4.13.x dove x è qualcosa e 4.14.0

Caret (^)

la versione principale è fissa, corrisponde a qualsiasi versione minore, corrisponde a qualsiasi numero di build

"supertest": "^3.0.0"

^3.0.0 significa che controllerà 3.xx dove x è qualcosa


Puoi approfondire in che modo questa risposta è diversa dalla stessa risposta postata 4 anni fa ?
Franklin Yu,

2

Il numero di versione è in sintassi che designa ogni sezione con significato diverso. la sintassi è suddivisa in tre sezioni separate da un punto.

major.minor.patch 1.0.2

Major, minor e patch rappresentano le diverse versioni di un pacchetto.

npm usa tilde (~) e caret (^) per designare quale patch e versioni minori usare rispettivamente.

Quindi, se vedi ~ 1.0.2 significa installare la versione 1.0.2 o l'ultima versione della patch come 1.0.4. Se vedi ^ 1.0.2 significa installare la versione 1.0.2 o l'ultima versione minore o patch come 1.1.0.


1
Puoi approfondire in che modo questa risposta è diversa dalla stessa risposta postata 4 anni fa ?
Franklin Yu,

2

carati ^ includono tutto ciò che è maggiore di una versione particolare nella stessa gamma principale.

tilde ~ include tutto ciò che è maggiore di una versione particolare nella stessa gamma minore.

Ad esempio, per specificare intervalli di versioni accettabili fino alla 1.0.4, utilizzare la sintassi seguente:

  • Rilasci di patch: 1.0 o 1.0.xo ~ 1.0.4
  • Rilasci minori: 1 o 1.xo ^ 1.0.4
  • Rilasci principali: * o x

Per ulteriori informazioni sulla sintassi del versioning semantico, consultare il calcolatore del semver npm .

npm versioni semantiche nei pacchetti pubblicati§

Altro dalla documentazione di npm Informazioni sul controllo delle versioni semantico


1

Non una risposta di per sé, ma un'osservazione che sembra essere stata trascurata.

La descrizione per le gamme di carati:

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

Consente modifiche che non modificano la cifra diversa da zero più a sinistra nella tupla [maggiore, minore, patch].

Mezzi che ^10.2.3corrispondono10.2.3 <= v < 20.0.0

Non penso sia quello che volevano dire. L'estrazione delle versioni da 11.xx a 19.xx interromperà il tuo codice.

Penso che intendessero left most non-zero number field. Non c'è nulla in SemVer che richiede che i campi numerici siano a una cifra.


0

~ specifica alle versioni di versioni minori ^ specifica alle versioni di versioni principali

Ad esempio, se la versione del pacchetto è 4.5.2, in Aggiornamento ~ 4.5.2 verrà installata la versione 4.5.x più recente (VERSIONE MINORE) ^ 4.5.2 verrà installata la versione 4.xx più recente (VERSIONE MAGGIORE)


8
Puoi approfondire in che modo questa risposta è diversa dalla stessa risposta postata 4 anni fa ?
Franklin Yu,

0

In relazione a questa domanda puoi consultare la documentazione di Composer sulle versioni , ma qui in breve:

  • Intervallo versione Tilde ( ~ ) - ~ 1.2.3 è equivalente a> = 1.2.3 < 1.3.0
  • Intervallo versione Caret ( ^ ) - ~ 1.2.3 è equivalente a> = 1.2.3 < 2.0.0

Quindi, con Tilde otterrai aggiornamenti automatici delle patch, ma le versioni minori e principali non verranno aggiornate. Tuttavia, se usi Caret otterrai patch e versioni secondarie, ma non otterrai versioni principali (modifiche non funzionanti).

La versione di Tilde è considerata un approccio "più sicuro", ma se si utilizzano dipendenze affidabili (librerie ben mantenute) non si dovrebbero riscontrare problemi con la versione Caret (poiché le modifiche minori non devono interrompere le modifiche.

Probabilmente dovresti rivedere questo post di StackOverflow sulle differenze tra l'installazione del compositore e l'aggiornamento del compositore .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.