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 .x
sintassi:
"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 === ~1
una gamma di punti di inserimento come ^1.2.3
ti 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 .x
sintassi: ti permettono semplicemente di fare di più. Ecco perché vedrai la tilde usata spesso anche dove .x
servirebbe. Ad esempio, vedi npm stesso: il suo file package.json include molte dipendenze nel ~2.4.0
formato, piuttosto che nel 2.4.x
formato 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"