非Python包项目中用poetry-dynamic-version实现幂等构建的方法
解决poetry-dynamic-versioning修改追踪文件导致的幂等性问题
针对你遇到的问题,有几种可行的解决思路,既能保留动态版本生成能力,又能避免修改被Git追踪的pyproject.toml:
1. 使用--dry-run获取版本,不修改文件
不需要执行poetry dynamic-versioning改动pyproject.toml,直接通过dry-run模式获取计算后的版本,全程不修改文件,从根源避免版本循环问题。
修改脚本中的相关代码:
# 直接获取动态版本,不修改pyproject.toml MODEL_VERSION=$(poetry dynamic-versioning --dry-run --short) export MODEL_VERSION
这样MODEL_VERSION会得到基于Git标签和提交的正确版本,同时pyproject.toml保持原样,不会触发Git状态变化。
2. 仅依赖构建后端动态生成版本,跳过主动修改文件
你的pyproject.toml已经配置了poetry_dynamic_versioning.backend作为构建后端,这个后端在执行poetry build时会自动计算并注入版本,不需要提前修改pyproject.toml。
可以完全移除脚本中poetry dynamic-versioning步骤,改为直接从构建后端获取版本:
# 从构建后端获取动态版本 MODEL_VERSION=$(poetry run python -c "from poetry_dynamic_versioning import get_version; print(get_version())") export MODEL_VERSION
这种方式下,pyproject.toml里的version字段可以设为占位值(比如0.0.0-dev),构建时会被动态替换,全程不会修改文件。
3. 临时修改文件后恢复(适合必须修改文件的场景)
如果你的流程必须依赖pyproject.toml中的版本值,可以在脚本中先备份原始文件,完成操作后再恢复:
# 备份原始pyproject.toml cp pyproject.toml pyproject.toml.bak # 更新版本并获取值 poetry dynamic-versioning MODEL_VERSION=$(poetry version --short --ansi) export MODEL_VERSION # 执行需要版本的操作(打包、生成资产等) # ... # 恢复原始文件,避免Git追踪变化 mv pyproject.toml.bak pyproject.toml
这种方式确保构建结束后pyproject.toml回到初始状态,不会因为提交修改而影响后续版本计算。
额外配置优化
建议把pyproject.toml中的version字段改为占位值,避免混淆:
[tool.poetry] name = "warpspeed-multiclass-model" version = "0.0.0-dev" # 占位值,构建时会被动态替换
内容的提问来源于stack exchange,提问作者David Waterworth
相关产品推荐
相关产品推荐

