release.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/env node
  2. import { execSync } from 'node:child_process'
  3. // 运行命令的封装
  4. const run = (cmd) => execSync(cmd, { stdio: 'inherit' })
  5. const out = (cmd) => execSync(cmd).toString().trim()
  6. console.log('\n🚀 发布流程开始...\n')
  7. // 1) 必须保证工作区干净
  8. const dirty = out('git status --porcelain')
  9. if (dirty) {
  10. console.error('❌ Git 工作区有未提交的改动,请先提交后再发版!\n')
  11. process.exit(1)
  12. }
  13. // 2) 动态导入 inquirer(避免依赖问题在早期就报错)
  14. const inquirer = (await import('inquirer')).default
  15. // 3) 选择版本类型
  16. const { releaseType } = await inquirer.prompt([
  17. {
  18. type: 'list',
  19. name: 'releaseType',
  20. message: '请选择版本类型:',
  21. choices: [
  22. { name: '补丁版本 (patch)', value: 'patch' },
  23. { name: '次版本 (minor)', value: 'minor' },
  24. { name: '主版本 (major)', value: 'major' },
  25. ],
  26. },
  27. ])
  28. // 4) 升级版本号(带 tag 与提交信息)
  29. run(`npm version ${releaseType} -m "new version published: v%s"`)
  30. // 5) 生成/更新 CHANGELOG(增量)
  31. try {
  32. run('npx conventional-changelog -p angular -i CHANGELOG.md -s')
  33. // 仅当 CHANGELOG 有变更时再提交,避免空提交报错
  34. const changed = out('git status --porcelain')
  35. if (/\sCHANGELOG\.md$/.test(changed) || /CHANGELOG\.md/.test(changed)) {
  36. run('git add CHANGELOG.md')
  37. run('git commit -m "docs: update changelog"')
  38. }
  39. } catch {
  40. console.warn(
  41. '⚠ 生成 changelog 失败:请确认已安装 conventional-changelog-cli(devDependencies)。'
  42. )
  43. }
  44. // 6) 推送代码与标签
  45. run('git push --follow-tags')
  46. console.log('\n🎉 发布完成!\n')