updateVersion.mjs 3.1 KB

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