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