updateVersion.mjs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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(`-> 写入 version.json 成功`)
  46. } catch (err) {
  47. console.log(`-> 写入 version.json 失败: `, err)
  48. throw err
  49. }
  50. }
  51. /**
  52. * 获取最新的版本号
  53. * @returns
  54. */
  55. function getLatestVersion() {
  56. return new Promise((resolve, reject) => {
  57. return exec('git describe --tags `git rev-list --tags --max-count=1`', (err, stdout, stderr) => {
  58. if (err) {
  59. reject()
  60. return console.error('获取版本号失败:', err)
  61. }
  62. console.log('最新版本号:', stdout)
  63. resolve(stdout.trim())
  64. })
  65. })
  66. }
  67. /**
  68. * 根据最新版本号来推荐下一个版本号
  69. * @param {*} latestVersion
  70. * @returns
  71. */
  72. function suggestNextVersion(latestVersion, type = 'patch') {
  73. const cleanVersion = semver.clean(latestVersion)
  74. if (cleanVersion) {
  75. return semver.inc(cleanVersion, type) // 或者 'minor' 或者 'major' 根据需要
  76. }
  77. return '1.0.0'
  78. }
  79. /**
  80. * 打上新的版本号 tag
  81. * @param {*} version
  82. */
  83. function createNewTag(version) {
  84. exec(`git tag -a ${version} -m "Release version ${version}" && git push origin ${version}`, (err) => {
  85. if (err) {
  86. return console.error(err)
  87. }
  88. console.log(`Tag ${version} created successfully.`)
  89. getLatestVersion()
  90. })
  91. }
  92. /**
  93. * 撤销某一个版本号的打版本号操作
  94. * @param {*} version
  95. */
  96. function revertTag(version) {
  97. exec(`git tag -d ${version}`, (err) => {
  98. if (err) {
  99. console.error(err)
  100. } else {
  101. console.log(`Tag ${version} reverted successfully.`)
  102. }
  103. })
  104. }
  105. // 主函数
  106. function autoTagVersion(type = 'patch') {
  107. getLatestVersion().then((latestVersion) => {
  108. const nextVersion = 'v' + suggestNextVersion(latestVersion, type)
  109. const content = readFileSync(packageFile, 'utf-8')
  110. const packageInfo = JSON.parse(content)
  111. packageInfo['version'] = nextVersion
  112. packageInfo['updateTime'] = dayjs().format('YYYY-MM-DD HH:mm:ss')
  113. // 写入文件
  114. writeJson(packageInfo, packageFile)
  115. writeJson(
  116. {
  117. version: nextVersion,
  118. updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  119. },
  120. versionFile
  121. )
  122. // 提交代码
  123. exec(`git add . && git commit -m "setTag ${nextVersion}" && git push`, (err, stdout, stderr) => {
  124. console.log(err, stdout, stderr)
  125. if (err) {
  126. return console.error('代码提交失败')
  127. }
  128. // 设置tag
  129. createNewTag(nextVersion)
  130. })
  131. })
  132. }