updateVersion.mjs 2.8 KB

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