Usando setuptools
ypbr
No hay una forma estándar de administrar la versión, pero la forma estándar de administrar sus paquetes es setuptools
.
La mejor solución que he encontrado en general para administrar la versión es usar setuptools
con la pbr
extensión. Esta es ahora mi forma estándar de administrar la versión.
Configurar su proyecto para el empaquetado completo puede ser excesivo para proyectos simples, pero si necesita administrar la versión, probablemente esté en el nivel correcto para configurar todo. Hacerlo también hace que su paquete sea liberable en PyPi para que todos puedan descargarlo y usarlo con Pip.
PBR mueve la mayoría de los metadatos de las setup.py
herramientas a un setup.cfg
archivo que luego se usa como fuente para la mayoría de los metadatos, que puede incluir la versión. Esto permite que los metadatos se empaqueten en un ejecutable usando algo como pyinstaller
si fuera necesario (si es así, probablemente necesitará esta información ), y separa los metadatos de los otros scripts de configuración / administración de paquetes. Puede actualizar directamente la cadena de versión de forma setup.cfg
manual, y se extraerá de la *.egg-info
carpeta al compilar las versiones de su paquete. Sus scripts pueden acceder a la versión de los metadatos utilizando varios métodos (estos procesos se describen en las secciones a continuación).
Al usar Git para VCS / SCM, esta configuración es aún mejor, ya que extraerá muchos de los metadatos de Git para que su repositorio pueda ser su fuente principal de verdad para algunos de los metadatos, incluida la versión, los autores, los registros de cambios, etc. Para la versión específicamente, creará una cadena de versión para la confirmación actual basada en las etiquetas git en el repositorio.
Como PBR extraerá la versión, el autor, el registro de cambios y otra información directamente de su repositorio de git, por lo que algunos de los metadatos setup.cfg
pueden omitirse y generarse automáticamente cada vez que se crea una distribución para su paquete (usando setup.py
)
Versión actual en tiempo real
setuptools
extraerá la información más reciente en tiempo real usando setup.py
:
python setup.py --version
Esto extraerá la última versión del setup.cfg
archivo o del repositorio de git, según la última confirmación realizada y las etiquetas que existen en el repositorio. Sin embargo, este comando no actualiza la versión en una distribución.
Actualizando la versión
Cuando crea una distribución con setup.py
(es decir py setup.py sdist
, por ejemplo), toda la información actual se extraerá y almacenará en la distribución. Esto esencialmente ejecuta el setup.py --version
comando y luego almacena esa información de versión en la package.egg-info
carpeta en un conjunto de archivos que almacenan metadatos de distribución.
Nota sobre el proceso para actualizar los metadatos de la versión:
Si no está utilizando pbr para extraer datos de versión de git, simplemente actualice su setup.cfg directamente con la información de la nueva versión (lo suficientemente fácil, pero asegúrese de que esta sea una parte estándar de su proceso de lanzamiento).
Si está usando git y no necesita crear una fuente o distribución binaria (usando python setup.py sdist
o uno de los python setup.py bdist_xxx
comandos), la forma más sencilla de actualizar la información de repositorio de git en su <mypackage>.egg-info
carpeta de metadatos es simplemente ejecutar el python setup.py install
comando. Esto ejecutará todas las funciones PBR relacionadas con la extracción de metadatos del repositorio de git y actualizará su .egg-info
carpeta local , instalará ejecutables de script para cualquier punto de entrada que haya definido y otras funciones que puede ver desde la salida cuando ejecuta este comando.
Tenga en cuenta que la .egg-info
carpeta generalmente se excluye de ser almacenada en el repositorio git en .gitignore
archivos Python estándar (como Gitignore.IO ), ya que puede generarse desde su fuente. Si se excluye, asegúrese de tener un "proceso de lanzamiento" estándar para actualizar los metadatos localmente antes del lanzamiento, y cualquier paquete que cargue en PyPi.org o distribuya de otra manera debe incluir estos datos para tener la versión correcta. Si desea que el repositorio de Git contenga esta información, puede excluir que se ignoren archivos específicos (es decir, agregar !*.egg-info/PKG_INFO
a .gitignore
)
Accediendo a la versión desde un script
Puede acceder a los metadatos desde la compilación actual dentro de los scripts de Python en el paquete mismo. Para la versión, por ejemplo, hay varias formas de hacer esto que he encontrado hasta ahora:
## 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))
Puede poner uno de estos directamente en su __init__.py
paquete para extraer la información de la versión de la siguiente manera, similar a algunas otras respuestas:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version