如何实现符合SemVer与PEP-440的CI特性分支Python跨包依赖工作流
解决方案
1. 基于PEP440本地版本标识生成唯一版本号
PEP440规范允许通过+后缀拼接自定义本地版本标识,私有PyPI和twine工具均支持上传携带该标识的包,仅公共PyPI会做限制。你可以直接配置setuptools_scm的版本生成规则,在不改动原有SemVer递增逻辑的前提下,生成全局唯一的特性分支版本:
- 统一版本格式为:
基础版本号.dev<提交距离上一个标签的步数>+<格式化后的分支名>.<git短哈希>,示例为0.10.1.dev3+feature.my.feature.in.lib.a682956d - 配置逻辑:在
my_lib的pyproject.toml中为setuptools_scm添加自定义版本回调,将分支名中的非字母数字字符统一转换为.或_,再拼接当前提交的7位git短哈希到+后缀即可。该格式完全符合PEP440要求,且所有并行分支的每一次提交都会生成唯一版本号,不会出现重复冲突。 - 兼容性说明:该版本格式完全兼容pip的依赖识别逻辑,不需要额外调整安装命令。
2. 依赖配置分层适配开发流程
为了避免开发阶段的临时依赖污染正式发布配置,你可以拆分依赖文件:
- 主
requirements.txt仅存放稳定正式版本的依赖,仅当my_lib的特性分支完成测试、合并到集成分支并发布正式版本后,再更新该文件中my_lib的版本号 - 新增
requirements-feature.txt作为特性分支专属的临时依赖配置,开发测试阶段在该文件中声明my_lib==<对应特性分支的唯一版本号>,my_app的特性分支CI执行时优先使用该文件安装依赖
3. CI流程联动优化(可选)
你可以对两个仓库的CI做简单联动降低人工维护成本:
my_lib的特性分支CI完成制品上传后,自动触发my_app对应特性分支的CI执行,或者自动提交PR更新requirements-feature.txt中的my_lib版本号- 配置私有PyPI的自动清理规则,当
my_lib的特性分支合并删除后,自动清理对应分支的临时版本包,减少存储冗余
该方案完全保留了你现有的SemVer自动递增逻辑,正式版本的生成规则不需要做任何改动,仅在特性分支开发阶段增加了唯一标识后缀,没有额外的工具替换成本。
内容的提问来源于stack exchange,提问作者sh0rtcircuit
相关产品推荐
相关产品推荐

