release.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/env node
  2. import { execSync } from 'node:child_process'
  3. import fs from 'node:fs'
  4. const run = (cmd) => execSync(cmd, { stdio: 'inherit' })
  5. const out = (cmd) => execSync(cmd).toString().trim()
  6. console.log('\n🚀 发布流程开始...\n')
  7. // 1) 检查 Git 工作区是否干净
  8. if (out('git status --porcelain')) {
  9. console.error('❌ Git 工作区有未提交的改动,请先提交后再发版!\n')
  10. process.exit(1)
  11. }
  12. // 2) 动态导入 inquirer
  13. const inquirer = (await import('inquirer')).default
  14. // 3) 选择版本类型
  15. const { releaseType } = await inquirer.prompt([
  16. {
  17. type: 'list',
  18. name: 'releaseType',
  19. message: '请选择版本类型:',
  20. choices: [
  21. { name: '补丁版本 (patch)', value: 'patch' },
  22. { name: '次版本 (minor)', value: 'minor' },
  23. { name: '主版本 (major)', value: 'major' },
  24. ],
  25. },
  26. ])
  27. // 4) 是否全量生成 changelog
  28. const { changelogMode } = await inquirer.prompt([
  29. {
  30. type: 'list',
  31. name: 'changelogMode',
  32. message: '生成 CHANGELOG 模式:',
  33. choices: [
  34. { name: '只追加自上次发布以来的日志 (推荐)', value: 'append' },
  35. { name: '重新生成完整历史日志 (谨慎)', value: 'full' },
  36. ],
  37. default: 'append',
  38. },
  39. ])
  40. // 5) 升级版本号
  41. run(`npm version ${releaseType} -m "new version published: v%s"`)
  42. // 6) 生成或更新 CHANGELOG
  43. try {
  44. let cmd
  45. if (changelogMode === 'full') {
  46. cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0'
  47. } else {
  48. if (!fs.existsSync('CHANGELOG.md')) {
  49. console.log('📄 未检测到 CHANGELOG.md,正在初始化...')
  50. cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0'
  51. } else {
  52. cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s'
  53. }
  54. }
  55. run(cmd)
  56. // 提交 CHANGELOG
  57. if (/CHANGELOG\.md/.test(out('git status --porcelain'))) {
  58. run('git add CHANGELOG.md')
  59. run('git commit -m "docs: update changelog"')
  60. }
  61. } catch {
  62. console.warn(
  63. '⚠ 生成 changelog 失败:请确认已安装 conventional-changelog-cli(devDependencies)。'
  64. )
  65. }
  66. // 7) 推送代码与标签
  67. run('git push --follow-tags')
  68. console.log('\n🎉 发布完成!\n')