updateVersion.mjs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. console.error('获取版本号失败:', err)
  43. reject()
  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}"`, (err) => {
  68. if (err) {
  69. console.error(err)
  70. } else {
  71. getLatestVersion()
  72. console.log(`Tag ${version} created successfully.`)
  73. }
  74. })
  75. }
  76. /**
  77. * 撤销某一个版本号的打版本号操作
  78. * @param {*} version
  79. */
  80. function revertTag(version) {
  81. exec(`git tag -d ${version}`, (err) => {
  82. if (err) {
  83. console.error(err)
  84. } else {
  85. console.log(`Tag ${version} reverted successfully.`)
  86. }
  87. })
  88. }
  89. // 主函数
  90. function autoTagVersion() {
  91. getLatestVersion().then((latestVersion) => {
  92. const nextVersion = 'v' + suggestNextVersion(latestVersion)
  93. createNewTag(nextVersion)
  94. const content = readFileSync(packageFile, 'utf-8')
  95. const packageInfo = JSON.parse(content)
  96. packageInfo['version'] = nextVersion
  97. packageInfo['updateTime'] = dayjs().format('YYYY-MM-DD HH:mm:ss')
  98. writeJson(packageInfo, packageFile)
  99. writeJson(
  100. {
  101. version: nextVersion,
  102. updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  103. },
  104. versionFile
  105. )
  106. })
  107. exec(`git commit -m "setTag ${nextVersion}"`, (err, stdout, stderr) => {
  108. console.log(err, stdout, stderr)
  109. if (err) {
  110. console.error('获取版本号失败:', err)
  111. }
  112. console.log('最新版本号:', stdout)
  113. })
  114. }