Usando setuptoolsypbr
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 setuptoolscon la pbrextensió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.pyherramientas a un setup.cfgarchivo 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 pyinstallersi 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.cfgmanual, y se extraerá de la *.egg-infocarpeta 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.cfgpueden 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
setuptoolsextraerá la información más reciente en tiempo real usando setup.py:
python setup.py --version
Esto extraerá la última versión del setup.cfgarchivo 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 --versioncomando y luego almacena esa información de versión en la package.egg-infocarpeta 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 sdisto uno de los python setup.py bdist_xxxcomandos), la forma más sencilla de actualizar la información de repositorio de git en su <mypackage>.egg-infocarpeta de metadatos es simplemente ejecutar el python setup.py installcomando. Esto ejecutará todas las funciones PBR relacionadas con la extracción de metadatos del repositorio de git y actualizará su .egg-infocarpeta 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-infocarpeta generalmente se excluye de ser almacenada en el repositorio git en .gitignorearchivos 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_INFOa .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__.pypaquete 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