如何在Python项目中实现类似CMake的单源版本控制?
Python项目单源版本控制方案(对标CMake风格)
我习惯用CMake给C/C++项目实现单源版本控制:
在CMakeLists.txt中写入:
project(Tutorial VERSION 1.0)
随后在*.h.in文件中使用占位符:
#define ver_maj @Tutorial_VERSION_MAJOR@ #define ver_min @Tutorial_VERSION_MINOR@
经configure_file()处理后,会生成对应的头文件:
#define ver_maj 1 #define ver_min 0
之后项目中任何需要访问版本号的地方直接引入该头文件即可。
但Python项目的体验完全不同,我常因忘记同步pyproject.toml和<module>/__init__.py中的版本号而重复构建。以下是实现类似CMake风格单源版本控制的几种首选方式:
方式一:标准库动态读取(无额外依赖)
只在pyproject.toml中维护版本号,代码通过Python标准库importlib.metadata动态读取已安装包的版本,无需手动同步__init__.py:
# <module>/__init__.py from importlib.metadata import version, PackageNotFoundError try: __version__ = version("your-package-name") except PackageNotFoundError: # 本地开发时包未安装的 fallback __version__ = "0.0.0-dev"
注意your-package-name必须和pyproject.toml中project.name字段完全一致。
方式二:用setuptools-scm自动生成版本(自动化首选)
无需手动编写版本号,直接从Git标签、提交记录自动生成版本,同时同步pyproject.toml和代码中的版本:
- 在
pyproject.toml中配置依赖和动态版本:
[build-system] requires = ["setuptools>=61.0", "setuptools-scm"] build-backend = "setuptools.build_meta" [project] dynamic = ["version"] [tool.setuptools_scm] # 可选配置:自定义版本格式、本地开发标记等
- 在
__init__.py中引入自动生成的版本:
from ._version import __version__
执行构建时,setuptools-scm会自动生成_version.py文件,同时pyproject.toml的版本也会自动同步。
方式三:手动维护单一源文件,用工具同步
如果偏好手动控制版本号,可以单独维护一个纯版本文件(比如VERSION,内容仅为1.0.0),再用工具同步到pyproject.toml和__init__.py。以bump2version为例:
- 安装工具:
pip install bump2version - 配置
.bumpversion.cfg:
[bumpversion] current_version = 1.0.0 commit = True tag = True [bumpversion:file:pyproject.toml] search = version = "{current_version}" replace = version = "{new_version}" [bumpversion:file:your_module/__init__.py] search = __version__ = "{current_version}" replace = __version__ = "{new_version}"
- 更新版本时执行命令:
bump2version patch(或minor/major),工具会自动更新所有配置文件中的版本号。
内容的提问来源于stack exchange,提问作者David Banas
相关产品推荐
相关产品推荐

