En utilisant setuptools
etpbr
Il n'y a pas de façon standard de gérer la version, mais la façon standard de gérer vos packages est setuptools
.
La meilleure solution que j'ai trouvée dans l'ensemble pour gérer la version est d'utiliser setuptools
avec l' pbr
extension. C'est maintenant ma façon standard de gérer la version.
La configuration de votre projet pour un emballage complet peut être exagérée pour des projets simples, mais si vous avez besoin de gérer la version, vous êtes probablement au bon niveau pour tout configurer. Cela rend également votre package libérable sur PyPi afin que tout le monde puisse le télécharger et l'utiliser avec Pip.
PBR déplace la plupart des métadonnées hors des setup.py
outils et dans un setup.cfg
fichier qui est ensuite utilisé comme source pour la plupart des métadonnées, qui peuvent inclure la version. Cela permet aux métadonnées d'être empaquetées dans un exécutable en utilisant quelque chose comme pyinstaller
si nécessaire (si c'est le cas, vous aurez probablement besoin de ces informations ), et sépare les métadonnées des autres scripts de gestion / configuration de package. Vous pouvez directement mettre à jour la chaîne de version danssetup.cfg
manuellement, et elle sera tirée dans le*.egg-info
dossier lors de la création des versions de votre package. Vos scripts peuvent ensuite accéder à la version à partir des métadonnées en utilisant différentes méthodes (ces processus sont décrits dans les sections ci-dessous).
Lorsque vous utilisez Git pour VCS / SCM, cette configuration est encore meilleure, car elle extrait de nombreuses métadonnées de Git afin que votre référentiel puisse être votre principale source de vérité pour certaines des métadonnées, y compris la version, les auteurs, les journaux des modifications, etc. Pour la version en particulier, il créera une chaîne de version pour la validation actuelle basée sur les balises git dans le référentiel.
Comme PBR extraira la version, l'auteur, le journal des modifications et d'autres informations directement à partir de votre dépôt git, certaines des métadonnées setup.cfg
peuvent être omises et générées automatiquement chaque fois qu'une distribution est créée pour votre package (en utilisant setup.py
)
Version actuelle en temps réel
setuptools
tirera les dernières informations en temps réel en utilisant setup.py
:
python setup.py --version
Cela extraira la dernière version du setup.cfg
fichier ou du dépôt git, en fonction de la dernière validation effectuée et des balises qui existent dans le dépôt. Cette commande ne met cependant pas à jour la version dans une distribution.
Mise à jour de la version
Lorsque vous créez une distribution avec setup.py
(c'est-à py setup.py sdist
- dire , par exemple), toutes les informations actuelles seront extraites et stockées dans la distribution. Cela exécute essentiellement la setup.py --version
commande, puis stocke ces informations de version dans le package.egg-info
dossier dans un ensemble de fichiers qui stockent les métadonnées de distribution.
Remarque sur le processus de mise à jour des métadonnées de version:
Si vous n'utilisez pas pbr pour extraire les données de version de git, mettez simplement à jour votre setup.cfg directement avec les nouvelles informations de version (assez facile, mais assurez-vous qu'il s'agit d'une partie standard de votre processus de publication).
Si vous utilisez git et que vous n'avez pas besoin de créer une distribution source ou binaire (en utilisant l' python setup.py sdist
une des python setup.py bdist_xxx
commandes), la façon la plus simple de mettre à jour les informations de dépôt git dans votre <mypackage>.egg-info
dossier de métadonnées consiste simplement à exécuter la python setup.py install
commande. Cela exécutera toutes les fonctions PBR liées à l'extraction des métadonnées du référentiel git et mettra à jour votre .egg-info
dossier local , installera les exécutables de script pour tous les points d'entrée que vous avez définis et d'autres fonctions que vous pouvez voir à partir de la sortie lorsque vous exécutez cette commande.
Notez que le .egg-info
dossier est généralement exclu du stockage dans le référentiel git lui-même dans des .gitignore
fichiers Python standard (tels que Gitignore.IO ), car il peut être généré à partir de votre source. S'il est exclu, assurez-vous que vous disposez d'un «processus de publication» standard pour obtenir les métadonnées mises à jour localement avant la publication, et tout package que vous téléchargez sur PyPi.org ou distribuez d'une autre manière doit inclure ces données pour avoir la version correcte. Si vous souhaitez que le référentiel Git contienne ces informations, vous pouvez exclure certains fichiers spécifiques d'être ignorés (c'est- !*.egg-info/PKG_INFO
à- dire les ajouter à .gitignore
)
Accéder à la version à partir d'un script
Vous pouvez accéder aux métadonnées à partir de la version actuelle dans les scripts Python du package lui-même. Pour la version, par exemple, il y a plusieurs façons de le faire jusqu'à présent:
## 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))
Vous pouvez en mettre un directement dans votre __init__.py
package pour extraire les informations de version comme suit, de la même manière que pour certaines autres réponses:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version