mirror of
https://github.com/dream-pep/koring-launcher.git
synced 2026-09-12 05:45:18 +08:00
fix(updater, ci, docs): 修复版本标签解析逻辑,调整发布流程与文档
重构electron/updater.ts中的版本比较函数,支持beta.N格式的预发布版本,调整buildId比较规则符合semver规范。 更新CI发布脚本,正式版生成带构建尾号的完整版本号并调整发布标题命名。 更新自动更新文档,说明新的版本规则与跨版本升级兼容性,纠正此前的错误认知。
This commit is contained in:
@@ -106,10 +106,11 @@ jobs:
|
||||
|
||||
# BUILD ID = GitHub Run Number(严格递增,无分钟级冲突)
|
||||
# base 自动读 package.json(版本单一事实源)
|
||||
# 版本格式(electron-updater GitHub provider 的频道逻辑只认 alpha/beta 字符串标识):
|
||||
# 版本格式(数字标识在 allowPrerelease 的通道逻辑中会被当"自定义频道",但正式版用户
|
||||
# allowPrerelease=false,走 /releases/latest(按 GitHub 的 prerelease 标记而非 semver):
|
||||
# 只要发布时不加 --prerelease,{base}-{buildId} 就是最新正式版,可正常识别):
|
||||
# beta → {base}-beta.{buildId}(如 1.2.1-beta.13,频道 beta)
|
||||
# run → {base}(稳定版,如 1.2.1)
|
||||
# 数字标识(如 1.2.1-13)会被当作"自定义频道"导致更新无法识别,故弃用
|
||||
# run → {base}-{buildId}(如 1.2.1-13,带构建尾号)
|
||||
- name: Generate BUILD ID & set version
|
||||
id: version
|
||||
shell: pwsh
|
||||
@@ -119,7 +120,7 @@ jobs:
|
||||
if ("${{ inputs.mode }}" -eq "beta") {
|
||||
$full = node scripts/version.js build ci "beta.$buildId"
|
||||
} else {
|
||||
$full = node scripts/version.js build local
|
||||
$full = node scripts/version.js build ci "$buildId"
|
||||
}
|
||||
"build_id=$buildId" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||
"base=$base" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||
@@ -174,9 +175,9 @@ jobs:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
$tag = "v${{ steps.version.outputs.full }}"
|
||||
# Release 标题命名(仅展示名;tag / 真实版本号仍是 {base}-beta.{id} 或 {base},更新机制不变):
|
||||
# 正式/预览版 → "1.2.1";测试版 → "BETA 1.2.1"
|
||||
$title = if ("${{ inputs.mode }}" -eq "beta") { "BETA ${{ steps.version.outputs.base }}" } else { "${{ steps.version.outputs.base }}" }
|
||||
# Release 标题命名(仅展示名;tag / 真实版本号是 {base}-beta.{id} 或 {base}-{id}):
|
||||
# 正式/预览版 → "1.2.5-13"(带构建尾号);测试版 → "BETA 1.2.5"
|
||||
$title = if ("${{ inputs.mode }}" -eq "beta") { "BETA ${{ steps.version.outputs.base }}" } else { "${{ steps.version.outputs.full }}" }
|
||||
|
||||
# 资产列表(beta 额外上传 latest-beta.yml:GitHub provider 频道取件(latest-beta)不再 404 回退)
|
||||
$assets = @(
|
||||
|
||||
+16
-13
@@ -299,13 +299,14 @@ src/
|
||||
**版本号与 BUILD ID(2026-08-30 起)**:
|
||||
- BUILD ID = `github.run_number`(严格递增、无分钟级冲突)
|
||||
- **beta**:`{base}-beta.{buildId}`(如 `1.2.1-beta.13`,tag `v1.2.1-beta.13`,GitHub 标记 prerelease)
|
||||
- **run**:`{base}`(稳定版,如 `1.2.1`,tag `v1.2.1`)
|
||||
- ⚠️ **为什么弃用数字标识**:electron-updater 的 GitHub provider 频道逻辑只认 `alpha`/`beta`
|
||||
字符串频道;`1.2.1-13` 的数字 prerelease 会被当作"自定义频道"导致更新检查
|
||||
`No published versions on GitHub`(无法识别当前/最新版本)。字母标识 `beta` 解决此问题。
|
||||
- **run**:`{base}-{buildId}`(如 `1.2.1-13`,tag `v1.2.1-13`,**带构建尾号**,普通 release 不加 `--prerelease`)
|
||||
- ⚠️ **数字标识与频道**:数字 prerelease 在 `allowPrerelease=true` 的通道逻辑里会被当作"自定义频道"
|
||||
(`beta`/`alpha` 之外)。但**正式版用户(woker)`allowPrerelease=false`**,走 `/releases/latest`
|
||||
(按 GitHub 的 prerelease **标记**而非 semver)→ 只要 run 发布时不加 `--prerelease`,
|
||||
`1.2.1-13` 就是最新正式版,可正常识别与更新。**run 发布切勿加 `--prerelease`**。
|
||||
- **兼容性**(semver 数字 < 字母):`1.2.1-beta.13 > 1.2.1-12 > 1.2.1-2608271921 > 1.2.1`,
|
||||
所有旧数字版本(含时间 ID 与 Run Number 时代)都能平滑升级到新格式;beta 用户可被正式版(稳定)覆盖
|
||||
- beta release 额外上传 `latest-beta.yml`(GitHub provider 频道取件用,避免 404 回退)
|
||||
所有旧数字版本(含时间 ID 与 Run Number 时代)都能平滑升级到新格式;beta 用户可被正式版覆盖
|
||||
- beta release 额外上传 `latest-beta.yml`(GitHub provider 频道取件兜底;实际先取 `beta.yml` 404 后回退 `latest.yml`)
|
||||
- 构建元数据(commit / buildId)由 `scripts/gen-build-info.js` 写入 `src/lib/buildInfo.ts` →
|
||||
打包进渲染层,VersionCard / 关于页显示**构建来源 commit**(`scripts/version.js build ci` 负责统一设版本)
|
||||
|
||||
@@ -314,17 +315,19 @@ src/
|
||||
- `## 更新了什么内容`:自上个 `v*` tag 以来的提交记录,每条默认折叠
|
||||
(`<details><summary>·Commit 1cf906d</summary>…</details>`)
|
||||
- 上传产物:setup.exe + latest.yml + release-notes.md(electron-updater 更新清单)
|
||||
- **Release 标题命名(仅展示名,tag/真实版本号不变)**:run → `{base}`(如 `1.2.1`),
|
||||
- **Release 标题命名(仅展示名,tag/真实版本号不变)**:run → `{full}`(如 `1.2.1-13`),
|
||||
beta → `BETA {base}`(如 `BETA 1.2.1`)
|
||||
|
||||
**⚠️ 版本语义注意(electron-updater,2026-08-30 已修复并落地)**:
|
||||
- **根因**:GitHub provider 用 Atom feed + 频道逻辑选版本,频道只认 `alpha`/`beta` 字符串标识。
|
||||
数字 prerelease(`1.2.1-4`)会被当作"自定义频道" → 永远选不出版本(`No published versions on GitHub`),
|
||||
且 `allowPrerelease` 由当前版本自动决定(含 prerelease 即开启)。
|
||||
- **修复**:beta 用 `{base}-beta.{buildId}`(频道 `beta`,allowPrerelease 自动开启 → 正常识别);
|
||||
run 用稳定版 `{base}`(allowPrerelease=false → 走 releases/latest,正常识别)。
|
||||
- 同格式升级:`1.2.1-beta.14 > 1.2.1-beta.13`(数值比较)✓;`1.2.1 > 1.2.1-beta.x`(稳定版覆盖 beta)✓
|
||||
- **无需手动设置 allowPrerelease**:electron-updater 按当前版本自动判定(见 AppUpdater.js:218)。
|
||||
数字 prerelease(`1.2.1-4`)在 `allowPrerelease=true` 的通道循环里会被当作"自定义频道"跳过,
|
||||
`allowPrerelease` 又由当前版本自动决定(含 prerelease 即开启)。
|
||||
- **修复**:beta 用 `{base}-beta.{buildId}`(频道 `beta`,正常识别);run 用 `{base}-{buildId}`
|
||||
且发布**不带** `--prerelease` → 正式版用户(`allowPrerelease=false`)走 `/releases/latest`
|
||||
按 GitHub 标记取最新正式版,正常识别。
|
||||
- 同格式升级:`1.2.1-beta.14 > 1.2.1-beta.13`(数值比较)✓;`1.2.1-14 > 1.2.1-13` ✓
|
||||
- 注意:当前版本为 `1.2.1-13`(数字尾号)时切到 runner 通道,通道逻辑会把 "13" 当自定义频道 → 无匹配,
|
||||
属预期边缘情况(数字尾号构建请使用 woker 通道);`1.2.1-beta.x` 的 runner 用户不受影响。
|
||||
- 所有旧数字版本(`1.2.1-12` / `1.2.1-2608271921`)都小于 `1.2.1-beta.13`,平滑升级,无需提升 base
|
||||
|
||||
## 14. M2 主进程更新模块(2026-08-28,UI 待做)
|
||||
|
||||
File diff suppressed because one or more lines are too long
+12
-4
@@ -98,17 +98,25 @@ function getMirrors(): string[] {
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较两个版本 tag(如 v1.2.1-5 / v1.2.1 / v1.2.0-2608271921),返回 a - b。
|
||||
* 比较两个版本 tag(如 v1.2.1-13 / v1.2.1-beta.14 / v1.2.0-2608271921),返回 a - b。
|
||||
* 项目版本为 {base}-{buildId}:base 按 X.Y.Z 数值比较,buildId 按数值比较(而非字符串)。
|
||||
* 无 buildId 的稳定版视为大于同 base 的任意 prerelease(与 semver 一致)。
|
||||
* - beta.N 视为大于同 base 的任意数字 buildId(与 semver 一致:数字 < 字母)
|
||||
* - 无 buildId 的稳定版视为大于同 base 的任意 prerelease(与 semver 一致)
|
||||
*/
|
||||
function compareVersionTags(a: string, b: string): number {
|
||||
const parse = (t: string): { base: number[]; build: number } => {
|
||||
const s = t.replace(/^v/i, '');
|
||||
const [base, build = ''] = s.split('-');
|
||||
const [base, buildStr = ''] = s.split('-');
|
||||
const nums = base.split('.').map((n) => parseInt(n, 10) || 0);
|
||||
while (nums.length < 3) nums.push(0);
|
||||
return { base: nums, build: build === '' ? Number.MAX_SAFE_INTEGER : parseInt(build, 10) || 0 };
|
||||
let build: number;
|
||||
if (buildStr === '') {
|
||||
build = Number.MAX_SAFE_INTEGER;
|
||||
} else {
|
||||
const beta = /^beta\.(\d+)$/i.exec(buildStr);
|
||||
build = beta ? 1_000_000 + parseInt(beta[1], 10) : parseInt(buildStr, 10) || 0;
|
||||
}
|
||||
return { base: nums, build };
|
||||
};
|
||||
const pa = parse(a);
|
||||
const pb = parse(b);
|
||||
|
||||
Reference in New Issue
Block a user