|
|
@@ -0,0 +1,154 @@
|
|
|
+#!/usr/bin/env node
|
|
|
+/**
|
|
|
+ * 跨平台版本号更新脚本
|
|
|
+ * Cross-platform version bump script
|
|
|
+ *
|
|
|
+ * 用法 / Usage:
|
|
|
+ * node scripts/bump-version.mjs <version>
|
|
|
+ * 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 <version>')
|
|
|
+ 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()
|