Python 让sphinx使用setup.py中的版本

Python 让sphinx使用setup.py中的版本,python,package,python-sphinx,Python,Package,Python Sphinx,如果我执行sphinx quickstart,我会被问及项目的版本 我想避免我的项目版本有两个位置 如何在python打包世界中做到这一点?最简单(可能也是最干净)的方法是定义顶级包的\uuuu init\uuuuuuuuuuuuuuuuupy,然后导入该包并在setup.py和Sphinx项目的conf.py中读取版本 假设您的项目名为myproject 将当前版本移出setup.py,改为将其作为myproject/\uuuu init\uuuuu.py中的变量: myproject/\uu

如果我执行
sphinx quickstart
,我会被问及项目的版本

我想避免我的项目版本有两个位置

如何在python打包世界中做到这一点?

最简单(可能也是最干净)的方法是定义顶级包的
\uuuu init\uuuuuuuuuuuuuuuuupy
,然后导入该包并在
setup.py
和Sphinx项目的
conf.py
中读取版本

假设您的项目名为
myproject

将当前版本移出
setup.py
,改为将其作为
myproject/\uuuu init\uuuuu.py
中的变量:

myproject/\uuuu init\uuuuu.py

# import foo
# ...

__version__ = '1.5'
from setuptools import setup
from myproject import __version__


project = "myproject"

setup(
    name=project,
    version=__version__,
    # ...
)
from myproject import __version__

# ...

# The short X.Y version.
version = __version__
# The full version, including alpha/beta/rc tags.
release = version
在项目的
setup.py
中导入
myproject
,并将硬编码版本替换为
myproject.\uuuuuuuuuu版本

setup.py

# import foo
# ...

__version__ = '1.5'
from setuptools import setup
from myproject import __version__


project = "myproject"

setup(
    name=project,
    version=__version__,
    # ...
)
from myproject import __version__

# ...

# The short X.Y version.
version = __version__
# The full version, including alpha/beta/rc tags.
release = version
在Sphinx项目的
conf.py
中,执行相同的操作。因此,按照以下几行编辑生成的
conf.py

docs/conf.py

# import foo
# ...

__version__ = '1.5'
from setuptools import setup
from myproject import __version__


project = "myproject"

setup(
    name=project,
    version=__version__,
    # ...
)
from myproject import __version__

# ...

# The short X.Y version.
version = __version__
# The full version, including alpha/beta/rc tags.
release = version
举一个库的例子,它的功能与此非常相似,请查看模块(| |)

这将处理使用项目版本时自动生成的文本(如文档首页的链接)。如果要在特定的自定义位置使用您的版本,可以使用指令动态插入
conf.py

中定义的配置值。您可以查看模块:

“一个小型命令行工具,通过以正确的增量更新源代码中的所有版本字符串来简化软件发布”


您可以使用配置文件
.bumpversion.cfg
来执行复杂的多文件操作。

更干净的选择可能是根据
setup.py
命令实际构建sphinx,如中所述:

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
    成为版本号的单一来源
  • 避免不必要地从项目文件夹中生成包

那么,这些答案对你有用吗?如果是,请接受相应的答案。如果没有,有什么问题?谢谢你的提问。我不急于谈论这个话题。我想要一个规范的答案。我将询问dist sig:Related:在另一个SO问题中,有人指出,如果您在myproject/\uuu init\uuuuuuuuuuuuuy.py中导入一些依赖项,然后在setup.py中从myproject import\uuuuuuuu version\uuuuuuuuuuuuuuuuuuuuuuuu执行
,如果不先安装依赖项,用户将无法安装软件包:我们还遇到了第三方导入的问题,并通过引入一个只包含元信息的单独软件包解决了这个问题。看看这个答案:您必须手动安装Sphinx,setup.py才能工作。因此,您不能再使用
pip3-e.