fix(devex): bump-version 修 BSD sed / lock 失败吞错 / package-lock 未同步

Codex 在 PR #294 上提了 3 个 P2,全部采纳:

P2-A: BSD sed 不支持 GNU 行号范围 0,/.../
  原 sed -E -i.bak "0,/^version = .../s//.../" 在 macOS 默认 BSD sed 上
  会 fail。换成 awk first-match 替换(mac BSD awk + GNU awk 都支持)。

P2-B: Cargo.lock 同步失败被 `|| true` 吞了
  原 cargo update -p openless ... || true 会让脚本继续,validate 又只
  校验 Cargo.toml 不校验 Cargo.lock。删 || true,让 set -euo pipefail
  在 cargo update fail 时立刻退出;同时 validate 加 Cargo.lock 校验。

P2-C: package-lock.json 未跟着同步
  npm 把 root version 也存在 package-lock.json 里(root + packages['']
  两处)。原脚本只 sed package.json 不更 lock,会让 npm ci 在 CI 出现
  EUSAGE。换成 npm version --no-git-tag-version --allow-same-version
  一次更两个文件。

ci.yml 的 verify step 也升级到校验 5 处一致:
  package.json / package-lock.json root+nested / tauri.conf.json /
  Cargo.toml / Cargo.lock 的 [openless] 包。

dry-run 已验证(用当前版本 1.2.20 跑一遍输出全部一致)。
This commit is contained in:
baiqing committed 2026-05-06 21:04:28 +08:00
1 parent 938c6a74b9
commit 97fca4abab
3 files changed
+74 -48

No files matched your search

+21 -8
View File
@@ -72,19 +72,32 @@ jobs:
- name: Check Tauri backend (cargo check)
run: cargo check --manifest-path src-tauri/Cargo.toml
- name: Verify version triplet stays in sync
- name: Verify version sync across all 5 files
# 两个平台都跑这个校验:Windows runner 自带 git-bash,跨 shell 表现一致。
# 一旦三处版本号 drift 立刻 fail,避免发版时再发现漏改。
# 一旦版本号 drift 立刻 fail,避免发版时再发现漏改。
# 校验 5 处:package.json / package-lock.json (root + nested) /
# tauri.conf.json / Cargo.toml / Cargo.lock 的 [openless] 包。
shell: bash
run: |
PKG=$(node -p "require('./package.json').version")
LOCK_ROOT=$(node -p "require('./package-lock.json').version")
LOCK_NESTED=$(node -p "require('./package-lock.json').packages[''].version")
TAU=$(node -p "require('./src-tauri/tauri.conf.json').version")
CRG=$(grep -E '^version = ' src-tauri/Cargo.toml | head -1 | sed -E 's/^version = "(.+)"$/\1/')
echo "package.json = $PKG"
echo "tauri.conf.json = $TAU"
echo "Cargo.toml = $CRG"
if [ "$PKG" != "$TAU" ] || [ "$PKG" != "$CRG" ]; then
echo "::error::version triplet 不一致 — 请用 scripts/bump-version.sh 同步更新"
# Cargo.lock:找 [openless] 包紧跟的 version 行
CARGO_LOCK_VER=$(awk 'BEGIN{found=0} /^name = "openless"$/{found=1; next} found && /^version = /{gsub(/"/,""); print $3; exit}' src-tauri/Cargo.lock)
echo "package.json = $PKG"
echo "package-lock root = $LOCK_ROOT"
echo "package-lock nested = $LOCK_NESTED"
echo "tauri.conf.json = $TAU"
echo "Cargo.toml = $CRG"
echo "Cargo.lock openless = $CARGO_LOCK_VER"
mismatch=0
for v in "$LOCK_ROOT" "$LOCK_NESTED" "$TAU" "$CRG" "$CARGO_LOCK_VER"; do
if [ "$v" != "$PKG" ]; then mismatch=1; fi
done
if [ "$mismatch" -ne 0 ]; then
echo "::error::版本号未对齐 — 请用 scripts/bump-version.sh 同步更新"
exit 1
fi
echo "[ok] 三处版本号一致:$PKG"
echo "[ok] 全部 5 处版本号一致:$PKG"
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "openless-app",
"version": "1.2.19",
"version": "1.2.20",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openless-app",
"version": "1.2.19",
"version": "1.2.20",
"dependencies": {
"@tauri-apps/api": "^2.1.1",
"@tauri-apps/plugin-autostart": "^2.5.1",
+51 -38
View File
@@ -1,15 +1,16 @@
#!/usr/bin/env bash
# 同步更新 OpenLess 三处版本号 + Cargo.lock。
# 同步更新 OpenLess 四处版本号。
# 用法:
# ./scripts/bump-version.sh 1.2.21
#
# 改的位置(CLAUDE.md 强调必须三处一起改):
# 改的位置(CLAUDE.md 强调必须同时改,否则 release-tauri.yml 失败):
# - openless-all/app/package.json "version": "X.Y.Z"
# - openless-all/app/package-lock.json 根包 version + 嵌套引用
# - openless-all/app/src-tauri/tauri.conf.json "version": "X.Y.Z"
# - openless-all/app/src-tauri/Cargo.toml version = "X.Y.Z"
# - openless-all/app/src-tauri/Cargo.toml version = "X.Y.Z" (顶层)
# - openless-all/app/src-tauri/Cargo.lock 通过 cargo update -p openless 同步
#
# CI 的 cross-platform 任务最后一步会校验三个文件版本号一致;漏改一处直接 fail。
# CI 的 cross-platform 任务最后一步会校验四个文件版本号一致;漏改一处直接 fail。
set -euo pipefail
@@ -30,68 +31,80 @@ REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
APP="$REPO_ROOT/openless-all/app"
PKG_JSON="$APP/package.json"
PKG_LOCK="$APP/package-lock.json"
TAURI_CONF="$APP/src-tauri/tauri.conf.json"
CARGO_TOML="$APP/src-tauri/Cargo.toml"
CARGO_LOCK="$APP/src-tauri/Cargo.lock"
for f in "$PKG_JSON" "$TAURI_CONF" "$CARGO_TOML"; do
for f in "$PKG_JSON" "$PKG_LOCK" "$TAURI_CONF" "$CARGO_TOML" "$CARGO_LOCK"; do
if [ ! -f "$f" ]; then
echo "错误:找不到 $f" >&2
exit 1
fi
done
# macOS sed 跟 GNU sed 行为不同(-i 后缀必填空字符串)。统一用 -i.bak 然后 rm。
update_json_version() {
local file="$1"
sed -E -i.bak \
"s/\"version\":[[:space:]]*\"[0-9]+\.[0-9]+\.[0-9]+\"/\"version\": \"$NEW\"/" \
"$file"
rm "$file.bak"
}
update_cargo_toml_version() {
local file="$1"
# 仅匹配文件顶层 [package] 段下的 version = "X.Y.Z",避免误改 dependencies 里的版本。
# OpenLess 项目 Cargo.toml 第一个出现的 version = 一定是 [package] 自己的。
sed -E -i.bak \
"0,/^version = \"[0-9]+\.[0-9]+\.[0-9]+\"$/s//version = \"$NEW\"/" \
"$file"
rm "$file.bak"
}
echo "▶ 升 package.json → $NEW"
update_json_version "$PKG_JSON"
# package.json + package-lock.json:npm version 一行同步两个,且不打 git tag。
# --allow-same-version 让脚本可重复运行(实际 release flow 不会,但 dry-run 友好)。
echo "▶ 升 package.json + package-lock.json → $NEW"
( cd "$APP" && npm version "$NEW" --no-git-tag-version --allow-same-version > /dev/null )
# tauri.conf.json:BSD sed 与 GNU sed 都支持 -E + -i.bak 后缀;不用行号范围地址。
echo "▶ 升 tauri.conf.json → $NEW"
update_json_version "$TAURI_CONF"
sed -E -i.bak \
"s/\"version\":[[:space:]]*\"[0-9]+\.[0-9]+\.[0-9]+\"/\"version\": \"$NEW\"/" \
"$TAURI_CONF"
rm "$TAURI_CONF.bak"
# Cargo.toml:用 awk 替换文件里第一个 version = "X.Y.Z" 行(顶层 [package].version)。
# 不用 GNU sed 的 `0,/.../` 行号范围地址(macOS BSD sed 不支持)。
echo "▶ 升 Cargo.toml → $NEW"
update_cargo_toml_version "$CARGO_TOML"
awk -v new="$NEW" '
!done && /^version = "[0-9]+\.[0-9]+\.[0-9]+"$/ {
sub(/"[0-9]+\.[0-9]+\.[0-9]+"/, "\"" new "\"")
done = 1
}
{ print }
' "$CARGO_TOML" > "$CARGO_TOML.tmp"
mv "$CARGO_TOML.tmp" "$CARGO_TOML"
# Cargo.lock:cargo update 显式同步 openless package;失败要立刻退出,不能吞错。
echo "▶ 同步 Cargo.lock"
( cd "$APP/src-tauri" && cargo update -p openless 2>&1 | grep -E 'Updating|Locking|^error' || true )
( cd "$APP/src-tauri" && cargo update -p openless 2>&1 | tail -5 )
# 校验五处一致(package.json / package-lock.json / tauri.conf.json / Cargo.toml / Cargo.lock)
echo
echo "===== 验证三处版本一致 ====="
echo "===== 验证版本一致性 ====="
PKG=$(node -p "require('$PKG_JSON').version")
LOCK_ROOT=$(node -p "require('$PKG_LOCK').version")
LOCK_NESTED=$(node -p "require('$PKG_LOCK').packages[''].version")
TAU=$(node -p "require('$TAURI_CONF').version")
CRG=$(grep -E '^version = ' "$CARGO_TOML" | head -1 | sed -E 's/^version = "(.+)"$/\1/')
CARGO_LOCK_VER=$(awk '/^name = "openless"$/{getline; if (match($0, /version = "([0-9.]+)"/, a)) {print a[1]; exit}}' "$CARGO_LOCK" 2>/dev/null \
|| awk 'BEGIN{found=0} /^name = "openless"$/{found=1; next} found && /^version = /{gsub(/"/,""); print $3; exit}' "$CARGO_LOCK")
printf '%-20s %s\n' 'package.json:' "$PKG"
printf '%-20s %s\n' 'tauri.conf.json:' "$TAU"
printf '%-20s %s\n' 'Cargo.toml:' "$CRG"
printf '%-22s %s\n' 'package.json:' "$PKG"
printf '%-22s %s\n' 'package-lock root:' "$LOCK_ROOT"
printf '%-22s %s\n' 'package-lock nested:' "$LOCK_NESTED"
printf '%-22s %s\n' 'tauri.conf.json:' "$TAU"
printf '%-22s %s\n' 'Cargo.toml:' "$CRG"
printf '%-22s %s\n' 'Cargo.lock (openless):' "$CARGO_LOCK_VER"
if [ "$PKG" != "$NEW" ] || [ "$TAU" != "$NEW" ] || [ "$CRG" != "$NEW" ]; then
echo "::error::三处版本号未对齐 — 请检查 sed 是否成功" >&2
mismatch=0
for v in "$LOCK_ROOT" "$LOCK_NESTED" "$TAU" "$CRG" "$CARGO_LOCK_VER"; do
if [ "$v" != "$NEW" ]; then mismatch=1; fi
done
if [ "$mismatch" -ne 0 ] || [ "$PKG" != "$NEW" ]; then
echo
echo "::error::版本号未对齐 — 请检查脚本输出" >&2
exit 1
fi
echo
echo "✓ 三处版本号一致:$NEW"
echo "✓ 全部一致:$NEW"
echo
echo "下一步建议:"
echo " git diff --stat $PKG_JSON $TAURI_CONF $CARGO_TOML \"$APP/src-tauri/Cargo.lock\""
echo " git add $PKG_JSON $TAURI_CONF $CARGO_TOML \"$APP/src-tauri/Cargo.lock\""
echo " git add $PKG_JSON $PKG_LOCK $TAURI_CONF $CARGO_TOML $CARGO_LOCK"
echo " git commit -m 'chore(release): $NEW'"
echo " git push"
echo " git tag v$NEW-tauri && git push origin v$NEW-tauri"