Files
openless/scripts/bump-version.sh
T
baiqing 97fca4abab 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 跑一遍输出全部一致)。
2026-05-06 21:04:28 +08:00

111 lines
4.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 同步更新 OpenLess 四处版本号。
# 用法:
# ./scripts/bump-version.sh 1.2.21
#
# 改的位置(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.lock 通过 cargo update -p openless 同步
#
# CI 的 cross-platform 任务最后一步会校验四个文件版本号一致;漏改一处直接 fail。
set -euo pipefail
if [ "${1:-}" = "" ]; then
echo "用法: $0 <new-version>" >&2
echo "例: $0 1.2.21" >&2
exit 1
fi
NEW="$1"
if ! [[ "$NEW" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "错误:版本号必须是 X.Y.Z 数字格式 (拿到 '$NEW')" >&2
exit 1
fi
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" "$PKG_LOCK" "$TAURI_CONF" "$CARGO_TOML" "$CARGO_LOCK"; do
if [ ! -f "$f" ]; then
echo "错误:找不到 $f" >&2
exit 1
fi
done
# 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"
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"
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 | tail -5 )
# 校验五处一致(package.json / package-lock.json / tauri.conf.json / Cargo.toml / Cargo.lock)
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 '%-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"
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
echo "下一步建议:"
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"