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


274

Bower mi consente di specificare i requisiti di versione per i pacchetti utilizzando la sintassi seguente:

"dependencies": {
  "<name>": "<version>",
},

Ma non sono stato in grado di trovare qual è la sintassi da utilizzare per <version>. So che posso specificare le versioni:

  • maggiore di una certa versione con ">1.0.0"
  • maggiore o uguale a una versione: ">=1.0.0"
  • o in qualche campo di: "1.0.0 - 2.0.0".

So anche che ci sia una sintassi 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, come esattamente 1.0.3più versioni maggiori di 1.5.0, ecc ...


3
Questo potrebbe essere un duplicato di stackoverflow.com/a/19040351/537738
David

Risposte:


341

In breve, la sintassi dei numeri di versione di Bower (e degli NPM) si chiama SemVer, che è l'abbreviazione di "Semantic Versioning". È possibile trovare la documentazione per la sintassi dettagliata di SemVer utilizzata in Bower e NPM sull'API per il parser semver all'interno di Node / npm . Puoi saperne di più sulle specifiche sottostanti (che non menziona ~o altri dettagli sulla sintassi) su semver.org .

C'è una calcolatrice semver visiva super maneggevole con cui puoi giocare, rendendo tutto molto più facile da eseguire e testare.

SemVer non è solo una sintassi! Ha alcune cose piuttosto interessanti da dire sui modi giusti per pubblicare le API, che aiuteranno a capire cosa significa la sintassi. In modo cruciale:

Una volta identificata l'API pubblica, le comunichi le modifiche con incrementi specifici al numero di versione. Considera un formato versione di XYZ (Major.Minor.Patch) . Le correzioni di bug che non influivano sull'API aumentano la versione della patch, le aggiunte / modifiche all'API compatibili all'indietro aumentano la versione secondaria e le modifiche all'API incompatibili all'indietro aumentano la versione principale.

Pertanto, la tua domanda specifica ~riguarda lo schema Major.Minor.Patch. (Come fa il relativo operatore ^.) È possibile utilizzare ~per restringere la gamma di versioni che si desidera accettare:

  • successive modifiche a livello di patch alla stessa versione secondaria ( "correzioni di bug che non influiscono sull'API" ) o:
  • successive modifiche di livello minore alla stessa versione principale ( "aggiunte / modifiche API compatibili con le versioni precedenti" )

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

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

Questo ti dà anche gli stessi risultati dell'utilizzo della .xsintassi:

"angular": "1.2.x"

Ma puoi usare la tilde / ~sintassi per essere ancora più specifici: se sei disposto ad accettare solo modifiche a livello di patch a partire dalla 1.2.4 , ma comunque meno della 1.3.0, useresti:

"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 di patch superiore a 1.0.0 e inferiore a 2.0:

Nota l'ultima variazione sopra: si chiama "intervallo di inserimento" . Il cursore ha un aspetto molto simile a un >, quindi saresti scusato per pensare che significhi "qualsiasi versione superiore alla 1.0.0". (Ci sono sicuramente scivolato.) No!

Le gamme di caret vengono sostanzialmente usate per dire che ti interessa solo la cifra più significativa a sinistra - di solito la versione principale - e che consentirai qualsiasi modifica di livello minore o di patch che non influisce sulla cifra più a sinistra. Tuttavia, a differenza di una gamma tilde che specifica una versione principale, le gamme di punti di inserimento consentono di specificare un preciso punto di partenza minore / patch. Quindi, mentre ^1.0.0 === ~1una gamma di punti di inserimento come ^1.2.3ti consente di dire che prenderete le modifiche >=1.2.3 && <2.0.0. Non puoi farlo con una gamma tilde.

All'inizio sembra tutto 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 per qualsiasi cifra significativa sia la più a sinistra. La tilde ti consente di dire che sei più preoccupato per qualsiasi cifra sia la più giusta. Il resto è dettaglio.

È il potere espressivo della tilde e del custode che spiega perché le persone li usano molto più della semplice .xsintassi: ti permettono semplicemente di fare di più. Ecco perché vedrai la tilde usata spesso anche dove .xservirebbe. Ad esempio, vedi npm stesso: il suo file package.json include molte dipendenze nel ~2.4.0formato, piuttosto che nel 2.4.xformato che potrebbe usare. Attenendosi a ~, la sintassi è coerente fino in fondo a un elenco di oltre 70 dipendenze con versione, indipendentemente dal numero di patch iniziale accettabile.

Comunque, c'è ancora di più in SemVer, ma non proverò a dettagliare tutto qui. Dai un'occhiata al readme del pacchetto semver del nodo . E assicurati di usare il calcolatore di versione semantica mentre ti alleni e cerchi di capire come funziona SemVer.


RE: Numeri di versione non consecutivi: l'ultima domanda di OP sembra riguardare la specifica di numeri / intervalli di versione non consecutivi (se l'ho modificato in modo equo). Sì, è possibile farlo, utilizzando il comune a doppio tubo "o" operatore: ||. Così:

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

27
Quindi ~in particolare significa che il numero di patch (terzo) può essere maggiore di quello specificato, ad esempio ~1.2.3è equivalente a >=1.2.3 <1.3.0.
z0r

1
Può essere utilizzato anche per il numero secondario (secondo), per le modifiche in linea sopra.
XML,

interessante, che la documentazione di SemVer sembra anche consentire la notazione x (che è molto più intuitiva per l'uomo).
Frank Nocke,

2
x-notation è intuitivo da leggere all'inizio, ma molto meno flessibile. Per esempio, '1.1.x' === '>=1.1.0' === '~1.1.0'. Il caso 1.1.0 è semplice. Ma la notazione x non può essere granulare, come può '>=1.1.4'o '~1.1.4'. Quindi, finisci '1.1.x'in un posto nel tuo elenco di dipendenze e '~2.7.3'in un altro posto. Va bene e funziona, ma uno sviluppatore deve quindi analizzare più sintassi per leggere un singolo elenco. E, se stai scrivendo pacchetti per impostare programmaticamente la versione, vuoi una singola sintassi. E la maggior parte delle persone vuole evitare che si rompano i cambiamenti. Quindi, tutti i problemi risolti ~.
XML

1
Hah. Penso che "grok" sia meno geografico di quello culturale (e forse legato all'età), @Clonkex. Per i futuri lettori: è un riferimento a Heinlein's Stranger in a Strange Land ...
XML

141

Basato su semver , puoi usare

  • Range di trattini 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 che sono consentite modifiche a livello di patch o modifiche minori alla versione.

  • Intervalli di inserimento ^ 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]

    • ^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)

21
Grazie per la risposta senza sciocchezze e di facile lettura. Non ho dovuto rintracciare o niente, solo, boom, c'è la risposta. Ben fatto;)
toddmo

76

Bower utilizza la sintassi semver , ma qui ci sono alcuni brevi esempi:

Puoi installare una versione specifica:

$ bower install jquery#1.11.1

Puoi usare ~ per specificare 'qualsiasi versione che inizia con questa':

$ bower install jquery#~1.11

È possibile specificare più requisiti di versione insieme:

$ bower install "jquery#<2.0 >1.10"

1
Sono curioso dell'uso pratico di questo. Installazione della roulette?
gravid

Guardando la risposta di @ XMLilley (e i documenti semver) "inizio con" sembra sbagliato, poiché 1.12, 1.13 andrebbero bene, purché la versione principale non
salga

13

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

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

1
semver non lo menziona. Dove hai stabilito che è valido? :) Dice " "*" := >=0.0.0(Qualsiasi versione soddisfa)" che è vicino ma un po 'vago in quanto non dice specificamente l'ultimo, quindi potrebbe essere il primo che trova?
GazB,

Ad essere onesti, è stato solo un tentativo ed errore: l'ho provato e ha funzionato! Potresti aver ragione sul fatto che non è valido al 100%, ma funziona.
shacker

7

Se non c'è un numero di patch, ~equivale ad aggiungere .xalla versione non tilde. Se esiste 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 delle informazioni tilde è in contrasto con il collegato semver documentazione: "angular": "~1.2"sarà non corrispondere 1.3, 1.4, 1.4.9. Inoltre "angular": "~1"e non"angular": "~1.0" sono equivalenti. Questo può essere verificato con il calcolatore semver npm .

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.