Sulla base della mia esperienza con la complessa gestione delle dipendenze a livello di piattaforma aziendale e il versioning delle versioni, sono venuto a raccomandare un approccio che mi piace chiamare Versioning semantico .
Fondamentalmente si basa su Semantic Versioning 2.0 ma non è altrettanto rigoroso.
Segmenti della versione semi-semantica:
<primary.release.segment>[-<pre.release.segment>][+<post.release.segment>]
Formato del segmento di rilascio principale:
MARKETTING.MAJOR.MINOR.PATCH
Ogni segmento dovrebbe consentire alfanumerici, ma i numeri puri sono raccomandati per cambiamenti incrementali logici.
Come SemVer, raccomando i componenti Major, Minor e Patch di rappresentare i livelli di compatibilità inversa, ma consiglio anche di anteporre un componente Marketing . Ciò consente ai proprietari di prodotti, alle epopee / ai gruppi di funzionalità e alle preoccupazioni aziendali di superare il componente principale indipendentemente dalle preoccupazioni di compatibilità tecnica.
A differenza di altre risposte, non ho raccomandato di aggiungere un numero di build al segmento principale. Invece, aggiungi un segmento post-rilascio seguendo un '+' (es: 1.1.0.0 + build.42). SemVer chiama questo metadata di build, ma penso che il segmento Post-Release sia più chiaro. Questo segmento è ottimo per dichiarare i dati del suffisso non correlati alle informazioni di compatibilità nel Segmento di rilascio principale. Alle build di integrazione continua può quindi essere assegnato il numero di versione precedente aggiunto con un numero di build incrementale che si reimposta dopo ogni versione principale (es: 1.1.0.0 -> 1.1.0.0 + build.1 -> 1.1.0.0 + build.2 -> 1.1.0.1). Ad alcune persone piace alternativamente inserire qui il numero di revisione svn o git commit sha per semplificare il collegamento al repository di codice. Un'altra opzione è quella di utilizzare il segmento post-release per hotfix e patch, quindi potrebbe valere la pena considerare l'aggiunta di un nuovo componente di release primario per questo. Può sempre cadere quando il componente patch viene incrementato, poiché le versioni sono effettivamente allineate a sinistra e ordinate.
Oltre ai segmenti di rilascio e post-rilascio, le persone spesso vogliono utilizzare un segmento di pre-rilascio per indicare pre-release quasi stabili come alfa, beta e candidati al rilascio. L'approccio di SemVer a questo funziona bene, ma raccomando di separare i componenti numerici dai classificatori alfanumerici (es: 1.2.0.0 + alpha.2 o 1.2.0.0 + RC.2). Normalmente si dovrebbe urtare il segmento di rilascio contemporaneamente all'aggiunta del segmento di post-rilascio e quindi rilasciare il segmento di pre-rilascio quando successivamente si salta il segmento di rilascio primario (es: 1.0.1.2 -> 1.2.0.0-RC.1 - > 1.2.0.0). I segmenti di pre-release vengono aggiunti per indicare che la versione di rilascio è in arrivo, di solito solo un set fisso di funzionalità per test più approfonditi e condivisione che non cambia minuto per minuto in base a più commit.
Il bello di avere tutto questo semanticamente definito in un modo che copre quasi tutti i casi d'uso è che puoi analizzarli, ordinarli, confrontarli e incrementarli in modo standard. Ciò è particolarmente importante quando si utilizzano sistemi di CI per applicazioni complesse con molti piccoli componenti con versione indipendente (come i micro-servizi) ciascuno con le proprie dipendenze gestite.
Se sei interessato, ho scritto un parser semi-semantico in rubino . Avevo bisogno non solo di utilizzare questo modello, ma anche di gestire altre app che lo utilizzavano.