| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #!/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()
|