Skip to content

fix(upgrade): parseVersionParts 未处理 + build metadata + 国内源缺失 #556

Open

Description

@PeterGuy326

背景

用户本地构建 v1.0.58-preview+botat-verify,执行 dws upgrade 显示「已是最新版本 v1.0.58-preview+botat-verify」。虽然从数字角度判断正确(1.0.58 > 线上 1.0.47),但暴露了以下问题。

问题 1:parseVersionParts 未处理 + build metadata

文件:internal/upgrade/version.go:34-47

当前只在第一个 - 处截断 prerelease,完全没处理 +:

func parseVersionParts(v string) [3]int {
    v = strings.TrimPrefix(v, "v")
    if idx := strings.IndexByte(v, '-'); idx >= 0 {
        v = v[:idx]
    }
    // ...
}

隐性 bug:如果版本号是 v1.0.58+foo(无 -preview 挡着),SplitN 后 strconv.Atoi("58+foo") 会返回 0,整个版本被解析为 [1,0,0],误判需要升级。

修复:在拆 - 之前先按 + 截断:

func parseVersionParts(v string) [3]int {
    v = strings.TrimPrefix(v, "v")
    if idx := strings.IndexByte(v, '+'); idx >= 0 {
        v = v[:idx]
    }
    if idx := strings.IndexByte(v, '-'); idx >= 0 {
        v = v[:idx]
    }
    // ...
}

测试用例(version_test.go 当前无 + 覆盖):

  • "1.0.58+build", "1.0.58", 0 — 相等
  • "1.0.58+build", "1.0.57", 1 — 大于
  • "v1.0.58-preview+botat-verify", "1.0.58", 0 — 相等

问题 2:dws upgrade 无国内源支持

当前 dws upgrade --list / --check 只走 GitHub API(DWS_UPGRADE_URL 可覆盖但要求 GitHub 兼容 schema)。

  • Gitee mirror(v1.0.40 起有 release)只用于 install.sh 首次安装
  • 国内用户如果 GitHub API 被墙/慢,dws upgrade 会超时或失败,没有 fallback

建议:

  • 在 FetchLatestRelease / FetchAllReleases 中增加 Gitee v5 API fallback,或
  • 当 DWS_UPGRADE_URL 指向 Gitee 时适配 v5 response schema,或
  • 新增 --mirror gitee flag / DWS_UPGRADE_MIRROR=gitee 环境变量

问题 3:preview 版本提示文案不清晰

当本地 preview 版本号高于线上 stable 时,已是最新版本 v1.0.58-preview+botat-verify 让人困惑。建议区分展示:

✔ 当前为预览版 v1.0.58-preview,已领先线上 stable v1.0.47

优先级建议

  • P0:问题 1(隐性 bug,特定版本格式下会误判)
  • P1:问题 2(影响国内用户升级体验)
  • P2:问题 3(UX 改进)

Activity

  1. haofeng0705 commented on Oct 20, 2026

    @haofeng0705
    Collaborator

    Hi @PeterGuy326 👋

    感谢这么细致的拆解!我们对照 v1.0.64、v1.0.65-beta.2 和 main 逐项核对了三个子问题:问题 1 已提交修复 #1532,问题 2 部分解决,问题 3 仍存在。

    1. + build metadata:已提交修复 #1532

    • 根因: 比较函数现在叫 parseVersion,仍只按 - 拆分版本号。+meta 会进入 patch 段(Atoi 失败后变成 0),或参与 prerelease 比较。
    • 影响: 当前版本号带 + 时,dws upgrade、dws upgrade --check 和 dws doctor 可能把更旧或相同的版本当成新版本,例如 v1.0.70+local 会把 v1.0.64 判为可升级;远端版本带 + 时又会漏报更新。我们用 v1.0.65-beta.2 配合本地模拟源复现过:远端最新版为 1.0.99+build.1 时 --check 返回 needs_upgrade: false,去掉 +build.1 后则能正常提示。
    • 修复方式: 和你的建议一致,解析前先去掉 +...,并补充了对应用例。补充一点:按 SemVer,预发布版本低于同号正式版,所以 v1.0.58-preview+botat-verify 与 1.0.58 比较的期望值应为 -1,而不是 0。

    PR 合并后,欢迎基于 main 构建或在后续版本中验证。如果仍有问题,请附上完整版本号、安装方式和 dws upgrade --check -f json 的输出。

    2. 国内源:部分解决

    从 v1.0.64 开始(#1470),dws upgrade --check、--list 和指定版本查询默认使用 npm Registry,不再依赖 GitHub API。如需使用国内镜像,可以这样设置:

    DWS_UPGRADE_REGISTRY=https://registry.npmmirror.com dws upgrade --check

    目前还没有 Gitee 或自动 fallback;显式设置 DWS_UPGRADE_URL / DWS_UPGRADE_REPOSITORY 时仍使用 GitHub 协议。另外,从 v1.0.65-beta.2 起,官方独立安装在默认 Registry 下会从 GitHub Release 下载当前平台的资产;设置 DWS_UPGRADE_REGISTRY 后,则改为从该 Registry 下载完整的 npm 包。

    3. 领先版本的文案:仍存在

    当前版本高于所选轨道的最新版本时,表格输出仍统一显示“已是最新版本”。例如 v1.0.65-beta.2 默认检查正式版轨道时,不会说明正式版最新是 v1.0.64,也不会提示可以用 --beta 检查 beta 更新。

    问题 2 和 3 还没有处理完,这个 Issue 先保持打开。再次感谢反馈,有新的场景或日志欢迎继续补充 🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions