Prhub

#22165 [Fix] Fix setuptools-scm version resolution for rc tags

原始 PR 作者 Kangyan-Zhou 合并时间 2026-04-06 07:55 文件变更 9 提交数 2 评论 2 代码增减 +179 / -16

执行摘要

修复 setuptools-scm 版本解析中 rc 标签排序错误,确保 CI 构建正确版本。

PR body 指出:git tag --sort=-version:refname 使用 strverscmp 排序,将 v0.5.10rc0 排在 v0.5.10 之上,导致 PyPI 发布工作流构建了 sglang-0.5.10rc0 而不是 sglang-0.5.10(参考失败运行链接)。需要修复此问题以确保发布版本正确。

建议精读 python/tools/get_version_tag.py 以理解版本解析策略,特别是 PEP 440 排序的实现和精确匹配与回退逻辑的权衡。关注设计决策如何解决 strverscmp 问题,并注意 review 中指出的效率问题。

讨论亮点

gemini-code-assist[bot] 在 review 中指出:get_latest_version_tag_describe 函数效率低下,因为它循环调用 git describe 并仍依赖有问题的 git tag --sort=-version:refname 排序,可能导致开发构建版本不正确(如相对于 rc 标签而非稳定标签)。但 PR 被 Fridge003 批准合并,可能问题被接受或留待后续优化。

实现拆解

  1. 创建版本解析脚本:新增 python/tools/get_version_tag.py,定义核心函数如 parse_version_tuple(实现 PEP 440 排序)、get_exact_version_tag(优先处理精确匹配标签)和 get_latest_version_tag_describe(回退到最高版本标签描述)。这样改的原因是为了避免 strverscmp 排序错误,并支持 CI 和开发构建。
  2. 更新配置契约:修改多个 pyproject.toml 文件(如 python/pyproject.tomlpython/pyproject_cpu.toml3rdparty/amd/wheel/sglang/pyproject.toml 等),将 git_describe_command 从原有的 bash 命令替换为调用新脚本(["python3", "python/tools/get_version_tag.py", "--tag-only"])。这确保 setuptools-scm 使用正确的版本解析逻辑。
  3. 调整 CI 工作流:更新 .github/workflows/release-pypi-pr.yml.github/workflows/release-pypi-nightly.yml,将版本标签获取命令从 git tag --list --sort=-version:refname 改为调用 Python 脚本,以保持版本一致性并避免排序问题。
  4. 测试配套:PR body 提到包含 18 个单元测试,但无测试文件变更;测试计划通过 python3 python/tools/test_get_version_tag.py 验证。
文件 模块 状态 重要度
python/tools/get_version_tag.py 工具脚本 added 8.77
.github/workflows/release-pypi-pr.yml CI 工作流 modified 4.09
python/pyproject.toml 项目配置 modified 3.87
3rdparty/amd/wheel/sglang/pyproject.toml 第三方配置 modified 3.47
.github/workflows/release-pypi-nightly.yml CI 工作流 modified 3.59

关键符号

parse_version_tuple run_git get_exact_version_tag get_latest_version_tag_describe get_version_describe get_latest_version_tag main

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

版本解析函数的效率与正确性 正确性

gemini-code-assist[bot] 指出 get_latest_version_tag_describe 函数效率低下且仍依赖有问题的 git tag --sort=-version:refname 排序,可能导致开发构建版本不正确。

结论:PR 被合并,但问题被指出,可能后续优化。 · 已解决

风险与影响

技术风险包括:新脚本 get_version_tag.py 可能引入解析错误,影响所有构建流程;版本排序逻辑复杂,边缘情况(如非标准标签)可能处理不当;依赖 git 命令执行,在特定环境(如浅克隆)可能失败。此外,脚本效率问题可能影响构建性能。

对用户影响:确保 PyPI 发布的包版本正确,避免用户安装错误版本。对系统影响:修复 CI 发布工作流的可靠性,防止静默失败。对团队影响:版本解析逻辑集中化,便于维护,但需关注脚本正确性和性能。影响范围限于构建和发布流程,不影响核心业务逻辑。

版本排序逻辑风险 脚本执行依赖 效率问题

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论