python 让sphinx使用www.example.com上的版本setup.py

koaltpgm  于 2023-02-15  发布在  Python
关注(0)|答案(6)|浏览(135)

如果我执行sphinx-quickstart,我会被问到项目的版本。
我想避免我的项目版本有两个地方。
在python打包世界中如何做到这一点呢?

8mmmxcuj

8mmmxcuj1#

最简单(也可能是最干净)的方法是为顶层包的__init__.py定义__version__,然后导入该包并读取setup.py和Sphinx项目的conf.py中的版本。
假设您的项目名为myproject
将当前版本移出setup.py,并使其成为myproject/__init__.py中的变量:

    • myproject/__init__.py**:
# import foo
# ...

__version__ = '1.5'

myproject导入到项目的setup.py中,并将硬编码版本替换为myproject.__version__

    • 一米十一米一x**:
from setuptools import setup
from myproject import __version__

project = "myproject"

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

在Sphinx项目的conf.py中,执行相同的操作。因此,按照以下代码行编辑生成的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中定义的配置值。

xfb7svmp

xfb7svmp2#

也许一个更简洁的选择是通过setup.py命令构建sphinx,如http://www.sphinx-doc.org/en/master/setuptools.html中所述:
setup.py

# this is only necessary when not using setuptools/distribute
from sphinx.setup_command import BuildDoc
cmdclass = {'build_sphinx': BuildDoc}

name = 'My project'
version = '1.2'
release = '1.2.0'
setup(
    name=name,
    author='Bernard Montgomery',
    version=release,
    cmdclass=cmdclass,
    # these are optional and override conf.py settings
    command_options={
        'build_sphinx': {
            'project': ('setup.py', name),
            'version': ('setup.py', version),
            'release': ('setup.py', release),
            'source_dir': ('setup.py', 'doc')}},
)

然后使用构建文档

$ python setup.py build_sphinx

好处:

  • 使setup.py成为版本号的单一来源
  • 避免不必要地从项目文件夹中创建包
whitzsjs

whitzsjs3#

您可以查看bumpversion模块:
“一个小的命令行工具,通过按正确的增量更新源代码中的所有版本字符串来简化软件的发布”
对于复杂的多文件操作,可以使用配置文件.bumpversion.cfg

f87krz0w

f87krz0w4#

另一种方法是将setuptools_scm集成到项目中。

from setuptools_scm import get_version

version = get_version()

在您conf.py

zpgglvta

zpgglvta5#

下面是一个简单明了的解决方案,具有讽刺意味的是,它来自setuptools_scm PyPI page

# contents of docs/conf.py
from importlib.metadata import version
release = version('myproject')
# for example take major/minor
version = '.'.join(release.split('.')[:2])

下面是他们对为什么不鼓励使用Sphinx的软件包的解释:

  • 根本原因是,像Read the Docs这样的服务有时会出于充分的理由更改工作目录,并且使用已安装的元数据可以防止在那里使用不必要的易失性数据。*
bwitn5fc

bwitn5fc6#

从pyproject.toml中提取信息

如果你使用pyproject.toml,你也可以用tomliconf.py中解析它,或者当你在 python ^3.11 上使用等价的tomllib
这样,您就可以从pyproject.toml中提取信息,并在您的sphinx文档配置中使用它。
下面是一个简短的不完整示例,使用tomli,假设conf.py
位于<project-root>/docs/source/conf.py

# conf.py

import tomli
with open("../../pyproject.toml", "rb") as f:
    toml = tomli.load(f)

# -- Project information -----------------------------------------------------

pyproject = toml["tool"]["poetry"]

project = pyproject["name"]
version = pyproject["version"]
release = pyproject["version"]

copyright = ...
author = ...

# and the rest of the configuration

相关问题