/* * @file /scripts/bump-version.mjs * @description 统一更新 Tauri 项目版本号 * @author tsl (randy1924@163.com) * @date 2026-03-23 10:23:42 * @lastModified 2026-03-23 10:25:08 * @lastModifiedBy tsl (randy1924@163.com) * @example node scripts/bump-version.mjs [patch|minor|major|x.y.z] * @default patch */ import { readFileSync, writeFileSync } from "node:fs"; import { resolve, dirname } from "node:path"; import { fileURLToPath } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); const root = resolve(__dirname, ".."); // 读取当前版本 function getCurrentVersion() { const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf-8")); return pkg.version; } // 根据 bump 类型计算新版本 function bumpVersion(current, type) { const parts = current.replace(/-.*$/, "").split(".").map(Number); switch (type) { case "major": return `${parts[0] + 1}.0.0`; case "minor": return `${parts[0]}.${parts[1] + 1}.0`; case "patch": return `${parts[0]}.${parts[1]}.${parts[2] + 1}`; default: return null; } } const arg = process.argv[2] || "patch"; const BUMP_TYPES = ["patch", "minor", "major"]; const current = getCurrentVersion(); let version; if (BUMP_TYPES.includes(arg)) { version = bumpVersion(current, arg); } else if (/^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/.test(arg)) { version = arg; } else { console.error(`错误: 无效参数 "${arg}",应为 patch / minor / major 或 x.y.z 格式`); process.exit(1); } const files = [ { path: "package.json", update(content) { const json = JSON.parse(content); const old = json.version; json.version = version; return { result: JSON.stringify(json, null, 2) + "\n", old }; }, }, { path: "src-tauri/tauri.conf.json", update(content) { const json = JSON.parse(content); const old = json.version; json.version = version; return { result: JSON.stringify(json, null, 2) + "\n", old }; }, }, { path: "src-tauri/Cargo.toml", update(content) { let old = ""; let replaced = false; const result = content.replace( /^version\s*=\s*"([^"]*)"/m, (match, v) => { if (replaced) return match; replaced = true; old = v; return `version = "${version}"`; } ); return { result, old }; }, }, ]; console.log(`\n${current} → ${version} (${BUMP_TYPES.includes(arg) ? arg : "指定版本"})\n`); for (const file of files) { const filePath = resolve(root, file.path); const content = readFileSync(filePath, "utf-8"); const { result, old } = file.update(content); writeFileSync(filePath, result, "utf-8"); console.log(` ✔ ${file.path} ${old} → ${version}`); } console.log("\n全部更新完成!"); console.log("提示: package-lock.json 和 Cargo.lock 会在下次 install/build 时自动同步\n");