Utilizzando setuptools
epbr
Non esiste un modo standard per gestire la versione, ma il modo standard per gestire i pacchetti è setuptools
.
La migliore soluzione che ho trovato nel complesso per la gestione della versione è quella di utilizzare setuptools
l' pbr
estensione. Questo è ora il mio modo standard di gestire la versione.
L'impostazione del progetto per il packaging completo può essere eccessiva per progetti semplici, ma se è necessario gestire la versione, probabilmente si è al livello giusto per impostare tutto. In questo modo, il pacchetto può essere rilasciato su PyPi in modo che tutti possano scaricarlo e utilizzarlo con Pip.
PBR sposta la maggior parte dei metadati dagli setup.py
strumenti e in un setup.cfg
file che viene quindi utilizzato come sorgente per la maggior parte dei metadati, che può includere la versione. Ciò consente ai metadati di essere impacchettati in un eseguibile usando qualcosa come pyinstaller
se necessario (in tal caso, probabilmente avrai bisogno di queste informazioni ) e separa i metadati dagli altri script di gestione / installazione del pacchetto. È possibile aggiornare direttamente la stringa di versione setup.cfg
manualmente e verrà estratta nella *.egg-info
cartella durante la creazione delle versioni del pacchetto. Gli script possono quindi accedere alla versione dai metadati utilizzando vari metodi (questi processi sono descritti nelle sezioni seguenti).
Quando si utilizza Git per VCS / SCM, questa configurazione è ancora migliore, poiché trarrà molti metadati da Git in modo che il repository possa essere la fonte principale di verità per alcuni dei metadati, tra cui versione, autori, log delle modifiche, ecc. Per la versione specifica, creerà una stringa di versione per il commit corrente in base ai tag git nel repository.
Poiché PBR estrarrà la versione, l'autore, il log delle modifiche e altre informazioni direttamente dal tuo repository git, così alcuni dei metadati setup.cfg
possono essere esclusi e generati automaticamente ogni volta che viene creata una distribuzione per il tuo pacchetto (usandosetup.py
)
Versione corrente in tempo reale
setuptools
estrarrà le ultime informazioni in tempo reale utilizzando setup.py
:
python setup.py --version
Ciò estrarrà la versione più recente dal setup.cfg
file o dal repository git, in base all'ultimo commit eseguito e ai tag esistenti nel repository. Questo comando però non aggiorna la versione in una distribuzione.
Aggiornamento della versione
Quando si crea una distribuzione con setup.py
(ad esempio py setup.py sdist
, ad esempio), tutte le informazioni correnti verranno estratte e archiviate nella distribuzione. Questo essenzialmente esegue il setup.py --version
comando e quindi memorizza le informazioni sulla versione nella package.egg-info
cartella in un set di file che memorizzano i metadati di distribuzione.
Nota sul processo di aggiornamento dei metadati della versione:
Se non stai usando pbr per estrarre i dati della versione da git, allora aggiorna il tuo setup.cfg direttamente con le informazioni sulla nuova versione (abbastanza facile, ma assicurati che questa sia una parte standard del tuo processo di rilascio).
Se stai usando git e non hai bisogno di creare una distribuzione sorgente o binaria (usando python setup.py sdist
o uno dei python setup.py bdist_xxx
comandi) il modo più semplice per aggiornare le informazioni di repository git nella <mypackage>.egg-info
cartella dei metadati è semplicemente eseguire il python setup.py install
comando. Questo eseguirà tutte le funzioni PBR relative all'estrazione dei metadati dal repository git e aggiornerà la .egg-info
cartella locale , installerà gli eseguibili di script per tutti i punti di ingresso che hai definito e altre funzioni che puoi vedere dall'output quando esegui questo comando.
Si noti che la .egg-info
cartella è generalmente esclusa dall'archiviazione nel repository git stesso nei .gitignore
file Python standard (come da Gitignore.IO ), poiché può essere generata dal proprio sorgente. Se viene escluso, assicurarsi di disporre di un "processo di rilascio" standard per ottenere i metadati aggiornati localmente prima del rilascio e che tutti i pacchetti caricati su PyPi.org o altrimenti distribuiti devono includere questi dati per avere la versione corretta. Se vuoi che il repository Git contenga queste informazioni, puoi escludere file specifici dall'ignorare (cioè aggiungere !*.egg-info/PKG_INFO
a .gitignore
)
Accesso alla versione da uno script
Puoi accedere ai metadati dalla build corrente all'interno degli script Python nel pacchetto stesso. Per la versione, ad esempio, ci sono diversi modi per farlo che ho trovato finora:
## This one is a new built-in as of Python 3.8.0 should become the standard
from importlib-metadata import version
v0 = version("mypackage")
print('v0 {}'.format(v0))
## I don't like this one because the version method is hidden
import pkg_resources # part of setuptools
v1 = pkg_resources.require("mypackage")[0].version
print('v1 {}'.format(v1))
# Probably best for pre v3.8.0 - the output without .version is just a longer string with
# both the package name, a space, and the version string
import pkg_resources # part of setuptools
v2 = pkg_resources.get_distribution('mypackage').version
print('v2 {}'.format(v2))
## This one seems to be slower, and with pyinstaller makes the exe a lot bigger
from pbr.version import VersionInfo
v3 = VersionInfo('mypackage').release_string()
print('v3 {}'.format(v3))
Puoi inserire uno di questi direttamente nel tuo __init__.py
pacchetto per estrarre le informazioni sulla versione come segue, in modo simile ad altre risposte:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version