La gestione delle versioni del software spesso dà vita a dibattiti infiniti nei team di sviluppo, soprattutto per i nomi non numerici. Un metodo universalmente riconosciuto per dare un numero alle modifiche apportate al software è stato definito molti anni fa e si chiama Semantic Versioning. Nulla di nuovo per chi utilizza i software opensource: si tratta di tre numeri (major, minor, patch), crescenti nel tempo, che indicano l’impatto delle modifiche rispetto alla precedente versione.
Su questo principio si basa anche Bumpversion, il tool che vedremo in questo articolo. Sebbene sia molto diffuso soprattutto tra i progetti Python, nulla vieta di usarlo nel proprio codice sorgente. Esso, infatti, rimpiazza una versione con la successiva, e se si utilizza GIT, si arrangia a mettere il tag giusto.
Installare Bumpversion
Bumpversion fa parte dell’ecosistema Python e può venire facilmente installato attraverso pip.
pip install --upgrade bumpversion
Una volta terminata l’installazione avrete a disposizione il tool da riga di comando per gestire le versioni del software.
Configurare Bumpversion
Bumpversion permette di gestire le versioni del software in modo molto snello, senza stravolgimenti del proprio metodo di sviluppo. Basta infatti introdurre nella cartella principale del vostro progetto il file .bumpversion.cfg
e inserire al suo interno queste poche righe:
[bumpversion]
current_version = 0.1.0
commit = True
tag = True
[bumpversion:file:README.md]
[bumpversion:file:transaction/__init__.py]
Le sezioni [bumpversion:file:]
indicano in quali file il tool dovrà cercare e sostituire il numero di versione. Quando configurate bumpversion dovete solo accertarvi che il valore di current_version
coincida esattamente con la stringa che indica la versione nei vari file sorgenti.
Bumpversion: Esempio Pratico
Vediamo di seguito come ho introdotto il versionamento nel mio progetto IngCsv.
I file con versione
Ho deciso di inserire la versione in due punti nel codice. Il primo è il file __init__.py
nel quale viene impostato l’attributo __version__
come da PEP 396.
# __init__.py
__version__ = '0.1.0'
L’ho poi inserito nel README.md
per versionare anche la documentazione.
### Status
Version: 0.1.0
Infine ho aggiunto del codice nel main del programma per visualizzazione la versione con il parametro --version
tipico dei programmi Unix.
from transaction import EstrattoConto, read_csv, __version__
[...]
ap.add_argument("-v", "--version", action="version", version='%(prog)s ' + __version__)
Bumpversion e Git
Di seguito ho predisposto una lista di comandi utili quando si lavora con Bumpversion. I primi permettono di avere un’anteprima delle modifiche che verranno fatte per aggiornare la versione. Il tool incrementa automaticamente di 1 il valore, mantenendo la coerenza. Quindi se siamo alla versione 1.2.3 e si chiede una minor, avremo 1.3.0.
La migrazione vera e propria è il comando dopo il commit:
bumpversion --dry-run --allow-dirty --verbose patch # bumpversion --dry-run --allow-dirty --verbose minor # bumpversion --dry-run --allow-dirty --verbose major git add . git commit -m "Started Versioning" bumpversion patch python ingcsv.py --version ingcsv.py 0.1.1
Avendo inserito nella configurazione l’abilitazione a commit e tag, con un solo comando avremo il nostro repository in ordine e con un tag dedicato solo al cambio versione.