Использование setuptools
иpbr
Не существует стандартного способа управления версиями, но стандартным способом управления вашими пакетами является setuptools
.
Лучшее решение, которое я нашел в целом для управления версией, это использовать setuptools
с pbr
расширением. Теперь это мой стандартный способ управления версией.
Настройка вашего проекта для полной упаковки может быть излишней для простых проектов, но если вам нужно управлять версией, вы, вероятно, на правильном уровне, чтобы просто все настроить. Это также делает ваш пакет повторно выпускаемым на PyPi, так что каждый может загрузить его и использовать с Pip.
PBR перемещает большинство метаданных из setup.py
инструментов в setup.cfg
файл, который затем используется в качестве источника для большинства метаданных, которые могут включать версию. Это позволяет упаковать метаданные в исполняемый файл, используя что-то вроде этого pyinstaller
(если это так, вам, вероятно, понадобится эта информация ), и отделить метаданные от других сценариев управления / настройки пакетов. Вы можете напрямую обновить строку версии setup.cfg
вручную, и она будет перенесена в*.egg-info
папку при сборке выпусков вашего пакета. Затем ваши сценарии могут получить доступ к версии из метаданных, используя различные методы (эти процессы описаны в разделах ниже).
При использовании Git для VCS / SCM эта настройка еще лучше, поскольку она будет извлекать большую часть метаданных из Git, так что ваше хранилище может стать вашим основным источником правды для некоторых метаданных, включая версию, авторов, журналы изменений, и т.д. Специально для версии, он создаст строку версии для текущего коммита на основе тегов git в репозитории.
Поскольку PBR будет извлекать версию, автора, журнал изменений и другую информацию непосредственно из вашего git-репо, поэтому некоторые из метаданных setup.cfg
могут быть опущены и автоматически сгенерированы при создании дистрибутива для вашего пакета (с использованием setup.py
)
Текущая версия в реальном времени
setuptools
будет получать последнюю информацию в режиме реального времени, используя setup.py
:
python setup.py --version
Последняя версия будет извлечена из setup.cfg
файла или из репозитория git, основываясь на последней сделанной фиксации и тегах, существующих в репо. Эта команда не обновляет версию в дистрибутиве.
Обновление версии
Когда вы создаете дистрибутив с помощью setup.py
(например py setup.py sdist
, например), тогда вся текущая информация будет извлечена и сохранена в дистрибутиве. По сути, это запускает setup.py --version
команду, а затем сохраняет информацию о версии в package.egg-info
папке в наборе файлов, в которых хранятся метаданные распространения.
Примечание о процессе обновления метаданных версии:
Если вы не используете pbr для извлечения данных о версии из git, просто обновите файл setup.cfg напрямую, добавив информацию о новой версии (достаточно просто, но убедитесь, что это стандартная часть процесса выпуска).
Если вы используете git и вам не нужно создавать исходный или двоичный дистрибутив (используя python setup.py sdist
одну из python setup.py bdist_xxx
команд), самый простой способ обновить информацию git-репо в вашей <mypackage>.egg-info
папке метаданных - просто запустить python setup.py install
команду. Это запустит все функции PBR, связанные с извлечением метаданных из репозитория git, и обновит вашу локальную .egg-info
папку, установит исполняемые файлы сценариев для всех точек входа, которые вы определили, и другие функции, которые вы увидите в выходных данных при запуске этой команды.
Обратите внимание, что .egg-info
папка, как правило, исключается из хранилища в самом git-репо в стандартных .gitignore
файлах Python (например, из Gitignore.IO ), так как она может быть сгенерирована из вашего исходного кода. Если это исключено, убедитесь, что у вас есть стандартный «процесс выпуска», чтобы метаданные обновлялись локально перед выпуском, и любой пакет, который вы загружаете на PyPi.org или распространяете иным образом, должен включать эти данные, чтобы иметь правильную версию. Если вы хотите, чтобы репозиторий Git содержал эту информацию, вы можете исключить игнорирование определенных файлов (т. Е. Добавить !*.egg-info/PKG_INFO
в .gitignore
).
Доступ к версии из скрипта
Вы можете получить доступ к метаданным из текущей сборки в скриптах Python в самом пакете. Например, для версии есть несколько способов сделать это:
## 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))
Вы можете поместить один из них непосредственно в свой __init__.py
пакет для извлечения информации о версии следующим образом, аналогично некоторым другим ответам:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version