【问题标题】:A build-system independent way to get the version from a package source directory从包源目录获取版本的独立于构建系统的方法
【发布时间】:2023-02-10 05:17:44
【问题描述】:
Python 包管理其版本数据的方式有很多种。是否有独立于构建系统的方法从包源目录中提取版本?
我知道 PEP 517 兼容的 Python 包生成器 build 在内部执行此操作。例如,在 Python 包 my_pkg 的示例源目录中:
$ python -m build --sdist
...
Successfully built my_pkg-1.2.0.tar.gz
那么有没有一种聪明的方法可以在不构建 sdist 的情况下提取版本号?
【问题讨论】:
标签:
python
versioning
pep517
【解决方案1】:
不。目前为 PEP 517 构建后端指定的唯一 mandatory hooks 是构建挂钩:
def build_sdist(sdist_directory, config_settings=None):
...
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
...
构建过程还会生成包元数据,包括 Version 字段。在一般情况下,有必要执行构建以获取版本信息。
请注意,动态生成版本信息也很常见,例如从底层version control system 采购它,因此无论如何只能在一小部分情况下从源目录中发现版本而无需构建。
一些构建后端可能提供其他方式来获取版本,例如在 setuptools 中你可以使用:
python3 -c 'import setuptools; setuptools.setup()' --version
但是,PEP 517 对此没有任何说明,它将特定于构建后端。
对于后端不可知的方式来生成版本,您可以使用 build.util.project_wheel_metadata,但是这可能(或可能不会)执行构建。