#!/usr/bin/env node /** * 跨平台版本号更新脚本 * Cross-platform version bump script * * 用法 / Usage: * node scripts/bump-version.mjs * node scripts/bump-version.mjs 1.0.0 * node scripts/bump-version.mjs patch # 0.0.6 -> 0.0.7 * node scripts/bump-version.mjs minor # 0.0.6 -> 0.1.0 * node scripts/bump-version.mjs major # 0.0.6 -> 1.0.0 * node scripts/bump-version.mjs patch --dry-run # 只输出计算后的版本号 */ import { readFileSync, writeFileSync } from 'fs' import { resolve, dirname } from 'path' import { fileURLToPath } from 'url' const __dirname = dirname(fileURLToPath(import.meta.url)) const rootDir = resolve(__dirname, '..') // 需要更新版本号的文件 const FILES = { packageJson: resolve(rootDir, 'package.json'), tauriConf: resolve(rootDir, 'src-tauri/tauri.conf.json'), cargoToml: resolve(rootDir, 'src-tauri/Cargo.toml'), } /** * 解析语义化版本号 */ function parseVersion(version) { const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/) if (!match) { throw new Error(`无效的版本号格式: ${version}`) } return { major: parseInt(match[1], 10), minor: parseInt(match[2], 10), patch: parseInt(match[3], 10), } } /** * 获取当前版本号 */ function getCurrentVersion() { const packageJson = JSON.parse(readFileSync(FILES.packageJson, 'utf-8')) return packageJson.version } /** * 计算新版本号 */ function getNewVersion(input) { const currentVersion = getCurrentVersion() const current = parseVersion(currentVersion) switch (input) { case 'major': return `${current.major + 1}.0.0` case 'minor': return `${current.major}.${current.minor + 1}.0` case 'patch': return `${current.major}.${current.minor}.${current.patch + 1}` default: // 验证输入是否为有效版本号 parseVersion(input) return input } } /** * 更新 package.json */ function updatePackageJson(version) { const content = JSON.parse(readFileSync(FILES.packageJson, 'utf-8')) content.version = version writeFileSync(FILES.packageJson, JSON.stringify(content, null, 2) + '\n', 'utf-8') console.log(`✓ 已更新 package.json -> ${version}`) } /** * 更新 tauri.conf.json */ function updateTauriConf(version) { const content = JSON.parse(readFileSync(FILES.tauriConf, 'utf-8')) content.version = version writeFileSync(FILES.tauriConf, JSON.stringify(content, null, 2) + '\n', 'utf-8') console.log(`✓ 已更新 src-tauri/tauri.conf.json -> ${version}`) } /** * 更新 Cargo.toml */ function updateCargoToml(version) { let content = readFileSync(FILES.cargoToml, 'utf-8') // 匹配 [package] 部分下的 version 字段 content = content.replace( /^(version\s*=\s*")[\d.]+(")/m, `$1${version}$2` ) writeFileSync(FILES.cargoToml, content, 'utf-8') console.log(`✓ 已更新 src-tauri/Cargo.toml -> ${version}`) } /** * 主函数 */ function main() { const args = process.argv.slice(2) const dryRun = args.includes('--dry-run') const versionArgs = args.filter((arg) => !arg.startsWith('--')) if (versionArgs.length === 0) { const currentVersion = getCurrentVersion() console.log(`当前版本: ${currentVersion}`) console.log('') console.log('用法:') console.log(' node scripts/bump-version.mjs ') console.log(' node scripts/bump-version.mjs 1.0.0 # 设置指定版本') console.log(' node scripts/bump-version.mjs patch # 补丁版本 +1') console.log(' node scripts/bump-version.mjs minor # 次版本 +1') console.log(' node scripts/bump-version.mjs major # 主版本 +1') console.log(' node scripts/bump-version.mjs patch --dry-run # 只输出计算后的版本号') process.exit(0) } const input = versionArgs[0] const currentVersion = getCurrentVersion() const newVersion = getNewVersion(input) // --dry-run 模式:只输出计算后的版本号(供其他脚本调用) if (dryRun) { console.log(newVersion) process.exit(0) } console.log(`版本更新: ${currentVersion} -> ${newVersion}`) console.log('') try { updatePackageJson(newVersion) updateTauriConf(newVersion) updateCargoToml(newVersion) console.log('') console.log(`✓ 所有文件已更新到版本 ${newVersion}`) } catch (error) { console.error(`✗ 更新失败: ${error.message}`) process.exit(1) } } main()