Qual è la syntax della versione di bower (e npm)?

Bower mi consente di specificare i requisiti di versione per i pacchetti usando la seguente syntax:

"dependencies": { "": "", }, 

Ma non sono stato in grado di trovare la syntax da utilizzare per . So che posso specificare le versioni per essere:

  • maggiore di una determinata versione con ">1.0.0"
  • maggiore o uguale a una versione: ">=1.0.0"
  • o in alcuni intervalli: "1.0.0 - 2.0.0" .

So anche che esiste una syntax di versione comune contenente la tilde: "~1.0.0" . Ma non sono sicuro di cosa significhi e se sia uguale a "=1.0.0" .

Sono anche interessato a sapere se sono in grado di specificare più versioni non consecutive, ad esempio esattamente 1.0.3 più versioni superiori a 1.5.0 , ecc …

In poche parole, la syntax per i numeri di versione di Bower (e NPM) si chiama SemVer, che è l’acronimo di ‘Semantic Versioning’. È ansible trovare la documentazione per la syntax dettagliata di SemVer utilizzata in Bower e NPM sull’API per il parser del semere in Nodo / npm . Puoi saperne di più sulle specifiche sottostanti (che non menzionano ~ o altri dettagli sulla syntax) su semver.org .

C’è una calcolatrice di semil grafico visuale super-pratica con cui puoi giocare, rendendo tutto questo molto più semplice da provare.

SemVer non è solo una syntax! Ci sono cose piuttosto interessanti da dire sui giusti modi di pubblicare le API, che aiuteranno a capire cosa significa la syntax. In modo cruciale:

Una volta identificata la tua API pubblica, comunichi le modifiche ad essa con incrementi specifici al numero di versione. Considera un formato di versione di XYZ (Major.Minor.Patch) . Correzioni di bug che non influiscono sull’API incrementano la versione della patch, aggiunte / modifiche dell’API compatibili con versioni precedenti incrementano la versione secondaria e le modifiche all’API incompatibili all’indietro incrementano la versione principale.

Quindi, la tua domanda specifica su ~ riferisce a quello schema Major.Minor.Patch. (Così come l’operatore di omogeneità ^ ). Puoi usare ~ per restringere la gamma di versioni che sei disposto ad accettare:

  • successive modifiche a livello di patch per la stessa versione secondaria ( “correzioni di bug che non influiscono sull’API” ), o:
  • successive modifiche di livello minore alla stessa versione principale ( “aggiunte / modifiche API retrocompatibili” )

Ad esempio: per indicare che verranno apportate eventuali modifiche a livello di patch successive nell’albero 1.2.x, a partire da 1.2.0, ma inferiore a 1.3.0, è ansible utilizzare:

 "angular": "~1.2" or: "angular": "~1.2.0" 

Questo ti dà gli stessi risultati dell’uso della syntax .x :

 "angular": "1.2.x" 

Tuttavia, puoi usare la syntax tilde / ~ per essere ancora più specifici: se desideri accettare solo modifiche a livello di patch a partire da 1.2.4 , ma ancora meno di 1.3.0, devi utilizzare:

 "angular": "~1.2.4" 

Spostandoti a sinistra, verso la versione principale , se usi …

 "angular": "~1" 

… è lo stesso di …

 "angular": "1.x" or: "angular": "^1.0.0" 

… e corrisponde a qualsiasi modifica di livello minore o patch superiore a 1.0.0 e inferiore a 2.0:

Nota l’ultima variante sopra: si chiama “intervallo di caret” . Il caret sembra un po ‘come un > , quindi ti verrebbe da pensare che significhi “qualsiasi versione superiore alla 1.0.0″. (Di sicuro l’ho infilato.) No!

Le gamme di retribuzione sono utilizzate fondamentalmente per dire che ci si preoccupa solo della cifra più significativa a sinistra, solitamente la versione principale, e che si autorizzano modifiche minori o di livello patch che non influiscono sulla cifra più a sinistra. Tuttavia, a differenza di una gamma di tilde che specifica una versione principale, gli intervalli di caret consentono di specificare un punto di partenza preciso / secondario. Quindi, mentre ^1.0.0 === ~1 , un intervallo di caret come ^1.2.3 ti consente di dire che cambierai >=1.2.3 && <2.0.0 . Non puoi farlo con una gamma di tilde.

All'inizio tutto sembra confuso, quando lo guardi da vicino. Ma rimpicciolisci per un secondo e pensaci in questo modo: il cursore ti consente semplicemente di dire che sei più preoccupato di qualsiasi cifra significativa rimasta. La tilde ti consente di dire che sei più preoccupato di qualsiasi cifra sia quella giusta. Il resto è dettaglio.

È il potere espressivo della tilde e del cursore che spiega perché le persone li usano molto più della più semplice syntax .x : semplicemente ti permettono di fare di più. Ecco perché vedrai la tilde usata spesso anche dove .x servirebbe. Ad esempio, vedere npm stesso: il suo file package.json include molte dipendenze in formato ~2.4.0 , piuttosto che il formato 2.4.x che potrebbe utilizzare. Attaccando a ~ , la syntax è coerente fino in fondo a un elenco di oltre 70 dipendenze con versioni, indipendentemente dal numero iniziale di patch accettabile.

Comunque, c'è ancora di più in SemVer, ma non cercherò di dettagliarlo qui. Controllalo sul readme del pacchetto semest del nodo . E assicurati di usare la calcolatrice semantica delle versioni mentre ti eserciti e prova a capire come funziona SemVer.


RE: Numeri di versione non consecutivi: la domanda finale dell'OP sembra riguardare la specificazione di numeri / intervalli di versione non consecutivi (se l'ho modificata in modo equo). Sì, puoi farlo utilizzando l'operatore "double pipe" comune: || . Così:

 "angular": "1.2 <= 1.2.9 || >2.0.0" 

Basato su semiver , puoi usare

  • Intervalli di 1.2.3-2.3.4 XYZ – ABC 1.2.3-2.3.4 Indica > = 1.2.3 <= 2.3.4

  • X-Ranges 1.2.x 1.X 1.2.*

  • Tilde Ranges ~1.2.3 ~1.2 Indica di consentire modifiche a livello di patch o modifiche minori della versione.

  • Intervalli di Caret ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    Consente le modifiche che non modificano la cifra non a sinistra più a sinistra nella tupla [major, minor, patch]

    • ^1.2.x (significa> = 1.2.0 <2.0.0)
    • ^0.0.x (significa> = 0.0.0 <0.1.0)
    • ^0.0 (significa> = 0.0.0 <0.1.0)

Bower usa la syntax del semere , ma ecco alcuni esempi rapidi:

Puoi installare una versione specifica:

 $ bower install jquery#1.11.1 

Puoi usare ~ per specificare ‘qualsiasi versione che inizia con questo’:

 $ bower install jquery#~1.11 

Puoi specificare più requisiti di versione insieme:

 $ bower install "jquery#<2.0 >1.10" 

Puoi anche utilizzare la parola chiave più recente per installare la versione più recente disponibile:

  "dependencies": { "fontawesome": "latest" } 

Se non c’è un numero di patch, ~ equivale ad aggiungere .x alla versione non-tilde. Se c’è un numero di patch, ~ consente tutti i numeri di patch> = quello specificato.

 ~1 := 1.x ~1.2 := 1.2.x ~1.2.3 := (>=1.2.3 <1.3.0) 

Non ho abbastanza punti per commentare la risposta accettata, ma alcune informazioni sulla tilde sono in disaccordo con la documentazione semiretta collegata: "angular": "~1.2" non corrisponde a 1.3, 1.4, 1.4.9. Anche "angular": "~1" e "angular": "~1.0" non sono equivalenti. Questo può essere verificato con il calcolatore del seminale npm .