1
0

bump-version.mjs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #!/usr/bin/env node
  2. /**
  3. * 跨平台版本号更新脚本
  4. * Cross-platform version bump script
  5. *
  6. * 用法 / Usage:
  7. * node scripts/bump-version.mjs <version>
  8. * node scripts/bump-version.mjs 1.0.0
  9. * node scripts/bump-version.mjs patch # 0.0.6 -> 0.0.7
  10. * node scripts/bump-version.mjs minor # 0.0.6 -> 0.1.0
  11. * node scripts/bump-version.mjs major # 0.0.6 -> 1.0.0
  12. * node scripts/bump-version.mjs patch --dry-run # 只输出计算后的版本号
  13. */
  14. import { readFileSync, writeFileSync } from 'fs'
  15. import { resolve, dirname } from 'path'
  16. import { fileURLToPath } from 'url'
  17. const __dirname = dirname(fileURLToPath(import.meta.url))
  18. const rootDir = resolve(__dirname, '..')
  19. // 需要更新版本号的文件
  20. const FILES = {
  21. packageJson: resolve(rootDir, 'package.json'),
  22. tauriConf: resolve(rootDir, 'src-tauri/tauri.conf.json'),
  23. cargoToml: resolve(rootDir, 'src-tauri/Cargo.toml'),
  24. }
  25. /**
  26. * 解析语义化版本号
  27. */
  28. function parseVersion(version) {
  29. const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/)
  30. if (!match) {
  31. throw new Error(`无效的版本号格式: ${version}`)
  32. }
  33. return {
  34. major: parseInt(match[1], 10),
  35. minor: parseInt(match[2], 10),
  36. patch: parseInt(match[3], 10),
  37. }
  38. }
  39. /**
  40. * 获取当前版本号
  41. */
  42. function getCurrentVersion() {
  43. const packageJson = JSON.parse(readFileSync(FILES.packageJson, 'utf-8'))
  44. return packageJson.version
  45. }
  46. /**
  47. * 计算新版本号
  48. */
  49. function getNewVersion(input) {
  50. const currentVersion = getCurrentVersion()
  51. const current = parseVersion(currentVersion)
  52. switch (input) {
  53. case 'major':
  54. return `${current.major + 1}.0.0`
  55. case 'minor':
  56. return `${current.major}.${current.minor + 1}.0`
  57. case 'patch':
  58. return `${current.major}.${current.minor}.${current.patch + 1}`
  59. default:
  60. // 验证输入是否为有效版本号
  61. parseVersion(input)
  62. return input
  63. }
  64. }
  65. /**
  66. * 更新 package.json
  67. */
  68. function updatePackageJson(version) {
  69. const content = JSON.parse(readFileSync(FILES.packageJson, 'utf-8'))
  70. content.version = version
  71. writeFileSync(FILES.packageJson, JSON.stringify(content, null, 2) + '\n', 'utf-8')
  72. console.log(`✓ 已更新 package.json -> ${version}`)
  73. }
  74. /**
  75. * 更新 tauri.conf.json
  76. */
  77. function updateTauriConf(version) {
  78. const content = JSON.parse(readFileSync(FILES.tauriConf, 'utf-8'))
  79. content.version = version
  80. writeFileSync(FILES.tauriConf, JSON.stringify(content, null, 2) + '\n', 'utf-8')
  81. console.log(`✓ 已更新 src-tauri/tauri.conf.json -> ${version}`)
  82. }
  83. /**
  84. * 更新 Cargo.toml
  85. */
  86. function updateCargoToml(version) {
  87. let content = readFileSync(FILES.cargoToml, 'utf-8')
  88. // 匹配 [package] 部分下的 version 字段
  89. content = content.replace(
  90. /^(version\s*=\s*")[\d.]+(")/m,
  91. `$1${version}$2`
  92. )
  93. writeFileSync(FILES.cargoToml, content, 'utf-8')
  94. console.log(`✓ 已更新 src-tauri/Cargo.toml -> ${version}`)
  95. }
  96. /**
  97. * 主函数
  98. */
  99. function main() {
  100. const args = process.argv.slice(2)
  101. const dryRun = args.includes('--dry-run')
  102. const versionArgs = args.filter((arg) => !arg.startsWith('--'))
  103. if (versionArgs.length === 0) {
  104. const currentVersion = getCurrentVersion()
  105. console.log(`当前版本: ${currentVersion}`)
  106. console.log('')
  107. console.log('用法:')
  108. console.log(' node scripts/bump-version.mjs <version>')
  109. console.log(' node scripts/bump-version.mjs 1.0.0 # 设置指定版本')
  110. console.log(' node scripts/bump-version.mjs patch # 补丁版本 +1')
  111. console.log(' node scripts/bump-version.mjs minor # 次版本 +1')
  112. console.log(' node scripts/bump-version.mjs major # 主版本 +1')
  113. console.log(' node scripts/bump-version.mjs patch --dry-run # 只输出计算后的版本号')
  114. process.exit(0)
  115. }
  116. const input = versionArgs[0]
  117. const currentVersion = getCurrentVersion()
  118. const newVersion = getNewVersion(input)
  119. // --dry-run 模式:只输出计算后的版本号(供其他脚本调用)
  120. if (dryRun) {
  121. console.log(newVersion)
  122. process.exit(0)
  123. }
  124. console.log(`版本更新: ${currentVersion} -> ${newVersion}`)
  125. console.log('')
  126. try {
  127. updatePackageJson(newVersion)
  128. updateTauriConf(newVersion)
  129. updateCargoToml(newVersion)
  130. console.log('')
  131. console.log(`✓ 所有文件已更新到版本 ${newVersion}`)
  132. } catch (error) {
  133. console.error(`✗ 更新失败: ${error.message}`)
  134. process.exit(1)
  135. }
  136. }
  137. main()