## 背景 用户本地构建 `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,完全没处理 `+`: ```go 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]`,误判需要升级。 **修复**:在拆 `-` 之前先按 `+` 截断: ```go 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
haofeng0705 commentedon Oct 20, 2026
Hi @PeterGuy326 👋
感谢这么细致的拆解!我们对照 v1.0.64、v1.0.65-beta.2 和 main 逐项核对了三个子问题:问题 1 已提交修复 #1532,问题 2 部分解决,问题 3 仍存在。
1.
+build metadata:已提交修复 #1532parseVersion,仍只按-拆分版本号。+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。如需使用国内镜像,可以这样设置:目前还没有 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 先保持打开。再次感谢反馈,有新的场景或日志欢迎继续补充 🙌
fix(upgrade): 版本比较忽略 SemVer build metadata