updateVersion.mjs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import dayjs from 'dayjs'
  2. import { exec } from 'child_process'
  3. import semver from 'semver'
  4. import { readFileSync, writeFileSync } from 'fs'
  5. // 初始化数据
  6. const packageFile = './package.json'
  7. const versionFile = './public/version.json'
  8. // 获取执行的参数
  9. const args = process.argv.slice(2)
  10. // console.log(args)
  11. // 暂停使用,禁止自动打tag
  12. // switch (args[0]) {
  13. // case '--patch':
  14. // autoTagVersion('patch')
  15. // break
  16. // case '--minor':
  17. // autoTagVersion('minor')
  18. // break
  19. // case '--major':
  20. // autoTagVersion('major')
  21. // break
  22. // default:
  23. // autoTagVersion('patch')
  24. // break
  25. // }
  26. /**
  27. * 自动打标签
  28. */
  29. // autoTagVersion()
  30. /**
  31. * 撤销标签
  32. */
  33. // revertTag('v1.6.1')
  34. /**
  35. * 获取最近的标签
  36. */
  37. // getLatestVersion()
  38. /**
  39. * 写入json文件
  40. * @param {*} version
  41. * @param {*} fileDirName
  42. */
  43. function writeJson(version, fileDirName) {
  44. try {
  45. writeFileSync(fileDirName, JSON.stringify(version, null, 2), { flag: 'w+', encoding: 'utf-8' })
  46. console.log(`-> 写入 ${fileDirName} 成功`)
  47. } catch (err) {
  48. console.error(`-> 写入 ${fileDirName} 失败: `)
  49. console.error(err)
  50. throw err
  51. }
  52. }
  53. /**
  54. * 获取最新的版本号
  55. * @returns
  56. */
  57. function getLatestVersion() {
  58. return new Promise((resolve, reject) => {
  59. return exec('git describe --abbrev=0 --tags', (err, stdout, stderr) => {
  60. if (err) {
  61. reject()
  62. console.error('获取版本号失败:', err)
  63. } else {
  64. console.log('最新版本号:', stdout)
  65. resolve(stdout.trim())
  66. }
  67. })
  68. })
  69. }
  70. /**
  71. * 根据最新版本号来推荐下一个版本号
  72. * @param {*} latestVersion
  73. * @returns
  74. */
  75. function suggestNextVersion(latestVersion, type = 'patch') {
  76. const cleanVersion = semver.clean(latestVersion)
  77. if (cleanVersion) {
  78. return semver.inc(cleanVersion, type) // 或者 'minor' 或者 'major' 根据需要
  79. }
  80. return '1.0.0'
  81. }
  82. /**
  83. * 打上新的版本号 tag
  84. * @param {*} version
  85. */
  86. function createNewTag(version) {
  87. exec(`git tag -a ${version} -m "Release version ${version}" && git push origin ${version}`, (err) => {
  88. if (err) {
  89. return console.error(err)
  90. }
  91. console.log(`Tag ${version} 创建成功`)
  92. getLatestVersion()
  93. })
  94. }
  95. /**
  96. * 撤销某一个版本号的打版本号操作
  97. * @param {*} version
  98. */
  99. function revertTag(version) {
  100. exec(`git tag -d ${version} && git push origin --delete ${version}`, (err) => {
  101. if (err) {
  102. console.error(err)
  103. } else {
  104. console.log(`Tag ${version} reverted successfully.`)
  105. }
  106. })
  107. }
  108. // 主函数
  109. function autoTagVersion(type = 'patch') {
  110. getLatestVersion().then((latestVersion) => {
  111. const nextVersion = 'v' + suggestNextVersion(latestVersion, type)
  112. const content = readFileSync(packageFile, 'utf-8')
  113. const packageInfo = JSON.parse(content)
  114. packageInfo['version'] = nextVersion
  115. packageInfo['updateTime'] = dayjs().format('YYYY-MM-DD HH:mm:ss')
  116. // 写入文件
  117. writeJson(packageInfo, packageFile)
  118. writeJson(
  119. {
  120. version: nextVersion,
  121. updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  122. },
  123. versionFile
  124. )
  125. // 提交代码
  126. exec(`git add . && git commit -m "setTag ${nextVersion}" && git push`, (err, stdout, stderr) => {
  127. if (err) {
  128. console.error('代码提交失败')
  129. console.error(err)
  130. return
  131. }
  132. // 设置tag
  133. createNewTag(nextVersion)
  134. })
  135. })
  136. }