release.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import inquirer from 'inquirer'
  2. import { execSync } from 'child_process'
  3. import fs from 'fs'
  4. import path from 'path'
  5. // changelog 文件路径
  6. const changelogPath = path.resolve('CHANGELOG.md')
  7. // 运行命令工具
  8. const run = (cmd) => execSync(cmd, { stdio: 'inherit' })
  9. // 检查 Git 工作区是否干净
  10. const isGitClean = () => {
  11. const status = execSync('git status --porcelain').toString().trim()
  12. return status === ''
  13. }
  14. // 检查是否有符合规范的提交
  15. const hasConventionalCommits = () => {
  16. let lastTag = ''
  17. try {
  18. lastTag = execSync('git describe --tags --abbrev=0', { stdio: 'pipe' }).toString().trim()
  19. } catch {
  20. // 没有 tag 不影响
  21. }
  22. const logCmd = lastTag
  23. ? `git log ${lastTag}..HEAD --pretty=format:%s`
  24. : `git log --pretty=format:%s`
  25. const log = execSync(logCmd, { stdio: 'pipe' }).toString().trim()
  26. return /^(feat|fix|docs|style|refactor|perf|test|chore)(\(.+\))?:/m.test(log)
  27. }
  28. // 1. 确保 changelog 文件存在
  29. if (!fs.existsSync(changelogPath)) {
  30. console.log(`📄 检测到不存在 ${changelogPath},已自动创建空文件`)
  31. fs.writeFileSync(changelogPath, '', 'utf-8')
  32. }
  33. // 2. 检查 git 工作区
  34. if (!isGitClean()) {
  35. console.error('❌ Git 工作区有未提交的改动,请先提交后再发版!')
  36. process.exit(1)
  37. }
  38. // 3. 检查提交规范
  39. if (!hasConventionalCommits()) {
  40. console.error('⚠️ 没有检测到符合 Angular 提交规范的提交,跳过 changelog 生成!')
  41. process.exit(1)
  42. }
  43. // 4. 询问生成 changelog 的方式
  44. const { mode } = await inquirer.prompt([
  45. {
  46. type: 'list',
  47. name: 'mode',
  48. message: '请选择 changelog 生成方式:',
  49. choices: [
  50. { name: '只追加日志(推荐)', value: 'incremental' },
  51. { name: '全量生成日志(会覆盖原文件)', value: 'all' },
  52. ],
  53. default: 'incremental',
  54. },
  55. ])
  56. // 5. 生成 changelog
  57. if (mode === 'all') {
  58. console.log('📝 正在全量生成 changelog...')
  59. fs.writeFileSync(changelogPath, '', 'utf-8') // 先清空
  60. run('npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0')
  61. } else {
  62. console.log('📝 正在追加 changelog...')
  63. run('npx conventional-changelog -p angular -i CHANGELOG.md -s')
  64. }
  65. // 6. 更新版本号(补丁版本)
  66. run('npm version patch -m "new version published: v%s"')
  67. // 7. 推送代码和 tag
  68. run('git push && git push --tags')
  69. console.log('✅ 发布完成!')