基于Poetry版本生成可导出的Python包版本号的最优方案
解决Poetry构建时导出Python包版本号的最优方案
方案1:用Python标准库importlib.metadata直接读取元数据(推荐)
不需要生成任何额外文件,直接从包的安装元数据中读取版本号,完全和Poetry配置的tool.poetry.version保持一致。
在你的包的__init__.py中添加以下代码:
from importlib.metadata import version, PackageNotFoundError try: __version__ = version("your-package-name") # 替换成你的包名 except PackageNotFoundError: # 本地开发未安装包时的 fallback,可自行调整 __version__ = "0.0.0-dev"
优势:
- 完全消除版本不一致的风险,版本号始终和Poetry配置同步
- 无需维护
__version__.py,也不用处理.gitignore的冲突问题 - 本地开发时,只要通过
poetry install或pip install -e .安装了可编辑版本,就能正确读取到版本
方案2:使用Poetry的动态版本功能
如果你的版本号是基于Git标签管理的,可以用Poetry官方的动态版本功能自动同步版本,再结合上面的importlib.metadata读取。
修改pyproject.toml:
[tool.poetry] name = "your-package-name" version = "0.0.0" # 占位值,会被动态替换 dynamic = ["version"] [tool.poetry.version] source = "tag" # 从Git标签自动获取版本,支持语义化标签
之后同样用importlib.metadata在代码中读取版本即可,Poetry在build时会自动将Git标签对应的版本注入到包元数据中。
方案3:通过构建脚本生成__version__.py(兼容旧版本场景)
如果一定要生成__version__.py,可以通过Poetry的构建脚本在构建阶段生成,避免.gitignore的影响:
- 在
pyproject.toml中配置构建脚本:
[tool.poetry.build] script = "build_version.py"
- 创建
build_version.py脚本,读取Poetry的版本并生成文件:
from poetry.factory import Factory def build(): poetry = Factory().create_poetry(".") version = poetry.version.text with open("your_package/__version__.py", "w") as f: f.write(f'__version__ = "{version}"\n') if __name__ == "__main__": build()
注意:
- 这个脚本会在
poetry build时自动执行,生成的__version__.py会被包含到构建包中(构建阶段不受.gitignore影响) - 本地开发时如果需要版本号,可以手动执行脚本,或者在
poetry install后通过importlib.metadata读取
内容的提问来源于stack exchange,提问作者fluffy
相关产品推荐
相关产品推荐

