Пусть sphinx использует версию из setup.py

Если я делаю sphinx-quickstart, меня спрашивают о версии проекта.

Я хочу, чтобы у меня не было двух мест для версии моего проекта.

Как это сделать в мире упаковки python?

Ответ 1

Самый простой (и, вероятно, самый чистый) способ - определить __version__ для __init__.py вашего пакета верхнего уровня, а затем импортируйте этот пакет и прочитайте версию как в setup.py, так и в проекте Sphinx conf.py.

Итак, скажем, ваш проект называется myproject.

Перенесите свою текущую версию из setup.py и вместо нее сделайте ее переменной myproject/__init__.py:

myproject/__init__.py

# import foo
# ...

__version__ = '1.5'

Импортируйте myproject в проект setup.py и замените жестко кодированную версию на myproject.__version__:

setup.py

from setuptools import setup
from myproject import __version__


project = "myproject"

setup(
    name=project,
    version=__version__,
    # ...
)

В проекте Sphinx conf.py сделайте то же самое. Поэтому отредактируйте созданный conf.py вдоль этих строк:

docs/conf.py

from myproject import __version__

# ...

# The short X.Y version.
version = __version__
# The full version, including alpha/beta/rc tags.
release = version

Для примера библиотеки, которая делает это примерно так, смотрите модуль requests (__init__.py | setup.py | conf.py).

Это позаботится об автогенерированных текстах, где используется версия проекта (например, ссылки на первую страницу документации). Если вы хотите использовать свою версию в определенных пользовательских местах, вы можете использовать директиву rst_epilog для динамического вставки значений конфигурации, определенных в conf.py.

Ответ 2

Вы можете посмотреть bumpversion module:

"Небольшой инструмент командной строки для упрощения выпуска программного обеспечения путем обновления всех строк версии в исходном коде с помощью правильного приращения"

Вы можете использовать конфигурационный файл .bumpversion.cfg для сложных многофайловых операций.