node.js - node - update npm




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

Nei termini più semplici, 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.

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 compresa la 1.3.0, ma rimarrà su 2.0.0.

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/

Si noti che la terminologia dell'autore è in qualche modo fuorviante: quando dice "la versione secondaria più recente" per ~ indica "la versione patch più recente nella versione secondaria specificata". Analogamente per ^, "la versione principale più recente" dovrebbe essere letta come "la versione minore più recente nella versione principale specificata".

Dopo aver aggiornato l'ultimo node stabile e npm , ho provato npm install moment --save . Salva la voce in package.json con il prefisso caret(^) . In precedenza, era un prefisso tilde(~) .

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

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Usa il semver.npmjs.com per il test. (Sebbene le spiegazioni per ^ (includi tutto ciò che è maggiore di una particolare versione nello stesso intervallo maggiore) e ~ (includi tutto più grande di una particolare versione nello stesso intervallo minore) non sono corrette al 100%, la calcolatrice sembra funzionare bene )
  • In alternativa, usa invece SemVer Check , che non richiede di scegliere un pacchetto e offre anche spiegazioni.

Consentire o disabilitare le modifiche

  • Versione pin: 1.2.3 .
  • Usa ^ (come la testa). Permette gli aggiornamenti al secondo livello non zero da sinistra: ^0.2.3 significa 0.2.3 <= v < 0.3 .
  • Usa ~ (come coda). Generalmente congela il livello più a destra o imposta zero se omesso:
    • ~1 significa 1.0.0 <= v < 2.0.0
    • ~1.2 significa 1.2.0 <= v < 1.3.0 .
    • ~1.2.4 significa 1.2.4 <= v < 1.3.0 .
  • Ommit right-most level: 0.2 significa 0.2 <= v < 1 . Differisce da ~ perché:
    • L'avvio della versione a livello omesso è sempre 0
    • È possibile impostare l'avvio della versione principale senza specificare i sottolivelli.

Tutte le possibilità (si spera)

Imposta l'avvio di livello principale e consenti gli aggiornamenti verso l'alto

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

Congela 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

Congela livello minore

^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

Blocca livello 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 : Mancano major, minor, patch o specificando beta senza numero, è lo stesso di any livello mancante.

Avviso : quando installi un pacchetto che ha 0 come livello principale, l'aggiornamento installerà solo una nuova versione beta / pr! Questo perché npm imposta ^ come predefinito in package.json e quando la versione installata è come 0.1.3 , blocca tutti i livelli major / minor / patch.


La corrispondenza di Hat può essere considerata "interrotta" perché non aggiorna ^0.1.2 a 0.2.0 . Quando il software sta emergendo, usa 0.xy versioni 0.xy e la corrispondenza del cappello corrisponderà solo all'ultima cifra variabile ( y ). Questo è fatto apposta. Il motivo è che mentre il software si evolve, l'API cambia rapidamente: un giorno hai questi metodi e l'altro giorno hai quei metodi e quelli vecchi sono spariti. Se non vuoi infrangere il codice per le persone che già utilizzano la tua libreria, vai ad incrementare la versione principale: es. 1.0.0 -> 2.0.0 -> 3.0.0 . Quindi, quando il tuo software sarà finalmente realizzato al 100% e pieno di funzionalità, sarà come la versione 11.0.0 e che non sembra molto significativo, e in realtà sembra confuso. Se invece, invece, utilizzassi le 0.1.x -> 0.2.x -> 0.3.x , quando il software sarà finalmente completo al 100% e le funzionalità complete 0.3.x rilasciate come versione 1.0.0 e ciò significa "Questa versione è una soluzione a lungo termine, è possibile procedere e utilizzare questa versione della libreria nel codice di produzione e l'autore non cambierà tutto domani o il mese prossimo e non abbandonerà il pacchetto".

La regola è: usa il 0.xy versioni 0.xy quando il tuo software non è ancora maturato e rilascialo con l'incremento della cifra centrale quando le tue API pubbliche cambiano (quindi le persone che hanno ^0.1.0 non riceveranno l'aggiornamento 0.2.0 e vince ' per rompere il loro codice). Quindi, quando il software matura, rilascialo sotto 1.0.0 e incrementa la cifra più a sinistra ogni volta che le tue API pubbliche cambiano (quindi le persone che hanno ^1.0.0 non riceveranno l'aggiornamento 2.0.0 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.

Npm consente di installare una versione più recente di un pacchetto rispetto a quella specificata. Usando tilde ( ~ ) si ottengono correzioni di correzioni di bug e caret ( ^ ) offre anche nuove funzionalità compatibili con le versioni precedenti.

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

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

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

Ecco una spiegazione visiva dei concetti:

Fonte: "Cheatsheet per il controllo della versione semantica" .


Vorrei aggiungere anche la documentazione ufficiale di npmjs che descrive tutti i metodi per la specificità della versione, compresi quelli indicati 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 ecc
  • <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
  • * Corrisponde a qualsiasi versione
  • latest Obtains

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


~ specifica per versioni minori versioni ^ specifica per versioni principali

Ad esempio se la versione del pacchetto è 4.5.2, su Update ~ 4.5.2 verrà installata l'ultima versione 4.5.x (MINOR VERSION) ^ 4.5.2 installerà la versione 4.xx più recente (MAJOR VERSION)


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

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

^ corregge solo il numero maggiore. Viene utilizzato quando si osservano da vicino le dipendenze e si è pronti a modificare rapidamente il codice se la versione secondaria non è compatibile.

In aggiunta a ciò, ^ non è supportato dalle vecchie versioni di npm e dovrebbe essere usato con cautela.

Quindi, ^ è un buon valore predefinito, ma non è perfetto. Suggerisco di scegliere con attenzione e configurare l'operatore semirigente più utile per te.


Una spiegazione di copertina

Il sistema di controllo delle versioni standard è major.minor.build (es. 2.4.1)

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

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

ad esempio: ~ 2.4.1 significa che controllerà per 2.4.x dove x è qualsiasi cosa

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

ad esempio: ^ 2.4.1 significa che controllerà per 2.xx dove x è qualsiasi cosa


~ Tilde:

  • ~ corregge i numeri maggiori e minori.
  • Viene utilizzato quando si è pronti ad accettare correzioni di errori nella dipendenza, ma non si desiderano eventuali 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 (~) fornisce correzioni di correzioni di bug

^ Caret:

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






npm