104 lines
3.0 KiB
JavaScript
104 lines
3.0 KiB
JavaScript
/*
|
|
* @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");
|