release.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/usr/bin/env node
  2. import { execSync } from 'child_process'
  3. import inquirer from 'inquirer'
  4. import fs from 'fs'
  5. function run(cmd) {
  6. execSync(cmd, { stdio: 'inherit' })
  7. }
  8. function getVersion() {
  9. return JSON.parse(fs.readFileSync('package.json', 'utf8')).version
  10. }
  11. async function main() {
  12. console.log('🚀 开始发布流程...')
  13. // 选择版本类型(默认 patch)
  14. const { versionType } = await inquirer.prompt([
  15. {
  16. type: 'list',
  17. name: 'versionType',
  18. message: '请选择版本类型:',
  19. default: 'patch',
  20. choices: [
  21. { name: '补丁版本 (patch)', value: 'patch' },
  22. { name: '小版本 (minor)', value: 'minor' },
  23. { name: '大版本 (major)', value: 'major' },
  24. ],
  25. },
  26. ])
  27. // 更新版本
  28. run(`npm version ${versionType} -m "feat: release new version: v%s"`)
  29. const version = getVersion()
  30. // 选择 changelog 生成模式(默认 incremental)
  31. const { changelogMode } = await inquirer.prompt([
  32. {
  33. type: 'list',
  34. name: 'changelogMode',
  35. message: '请选择 changelog 生成模式:',
  36. default: 'incremental',
  37. choices: [
  38. { name: '全量生成(会覆盖整个文件)', value: 'full' },
  39. { name: '增量生成(只追加本次更新的内容)', value: 'incremental' },
  40. ],
  41. },
  42. ])
  43. console.log('📝 正在生成 changelog...')
  44. if (changelogMode === 'full') {
  45. run('npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0')
  46. } else {
  47. run('npx conventional-changelog -p angular -i CHANGELOG.md -s')
  48. }
  49. // 安全 add(存在才加)
  50. if (fs.existsSync('package-lock.json')) {
  51. run('git add package.json package-lock.json')
  52. } else {
  53. run('git add package.json')
  54. }
  55. run('git add CHANGELOG.md')
  56. // 仅在有变更时提交
  57. try {
  58. run(`git diff --cached --quiet || git commit -m "chore: update changelog for v${version}"`)
  59. } catch (err) {
  60. console.log('⚠️ 没有需要提交的文件,跳过 commit', err)
  61. }
  62. // 推送代码 & tag
  63. run('git push --follow-tags')
  64. console.log('\x1b[36m=========================\x1b[0m')
  65. console.log('\x1b[32m🎉 发布成功!\x1b[0m')
  66. console.log(`\x1b[33m📦 版本号:v${version}\x1b[0m`)
  67. console.log('\x1b[35m⚙️ 部署:\x1b[0m')
  68. console.log('\x1b[34m * 测试环境:npm run deploy:test\x1b[0m')
  69. console.log('\x1b[34m * 开发环境:npm run build:dev\x1b[0m')
  70. console.log('\x1b[34m * 生产环境:npm run build\x1b[0m')
  71. console.log('\x1b[36m=========================\x1b[0m')
  72. }
  73. main()