12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #!/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')
|