#python #packaging #setuptools
#python #упаковка #setuptools
Вопрос:
Необходимо предоставить функции установки в файле setup.py как строка версии, так и статус разработки (см. https://python-packaging-user-guide.readthedocs.org/en/latest/tutorial.html и проект, приведенный в качестве примера https://github.com/pypa/sampleproject/blob/master/setup.py )
Вот более простой пример:
from setuptools import setup
import os
here = os.path.abspath(os.path.dirname(__file__))
# Get the version from the relevant file
with open(os.path.join(here, 'namepackage/_version.py')) as f:
exec(f.read())
# In namepackage/_version.py, there is just something like
# __version__= '1.1a2', where 'a' means alpha (see
# http://legacy.python.org/dev/peps/pep-0386/).
setup(
name='namepackage',
version=__version__,
# skip arguments for clarity
classifiers=[
# How mature is this project? Common values are
# 3 - Alpha
# 4 - Beta
# 5 - Production/Stable
'Development Status :: 4 - Beta'
]
)
В этом случае строка версии записывается в файле namepackage/_version .py и он также содержит информацию о статусе разработки, поэтому должен быть способ получить статус разработки в виде строки (‘3 — Alpha’ в этом примере) из строки версии. В противном случае необходимо последовательно изменять оба _version .py и setup.py , что кажется не очень умным (и это так легко забыть, что привело бы к противоречивой информации, как в примере!).
Есть ли функция для этого в стандартной библиотеке Python? В противном случае, что было бы разумным способом сделать это?
Ответ №1:
Не существует реального стандарта для обозначения альфа- или бета-версии в строке версии, и классификатор не требуется для корреляции. 0.x
Например, я мог бы отметить статус бета-версии или даже альфа-версии, потому что я все еще хотел развивать API-интерфейсы и не переходить на производство / стабильность до 1.x
.
Таким образом, это зависит от ваших собственных политик выпуска проекта, когда переключать классификаторы, и если это соотносится со строкой версии, реализовать некоторый синтаксический анализ строки самостоятельно.
Это может быть так просто, как:
devstatus = ''Development Status :: 5 - Production/Stable'
if 'b' in __version__:
devstatus = ''Development Status :: 4 - Beta'
elif 'a' in __version__:
devstatus = ''Development Status :: 3 - Alpha'
Комментарии:
1. Спасибо за ответ. В предлагаемом коде их слишком много, но в противном случае это сработало бы. Если бы мне пришлось реализовать это самому, я бы сделал что-нибудь более безопасное
from pkg_resources import parse_version
. Я все еще думаю, что странно, что можно использовать ‘Development Status :: 5 — Production / Stable’ со строкой версии, которая явно является альфа или бета, как определено в PEP 386.2.
parse_version
отлично подходит для сортировки версий, но не более полезен для тестирования альфа- или бета-статуса, опять же, если в вашем проекте нет политики в отношении того, какую терминологию использовать.any(p.startswith('*a') for p on parse_version(__version__))
чувствовал себя слишком подробным, когда могло быть достаточно простого удержания строки.