import inquirer from 'inquirer' import { execSync } from 'child_process' import fs from 'fs' import path from 'path' // changelog 文件路径 const changelogPath = path.resolve('CHANGELOG.md') // 运行命令工具 const run = (cmd) => execSync(cmd, { stdio: 'inherit' }) // 检查 Git 工作区是否干净 const isGitClean = () => { const status = execSync('git status --porcelain').toString().trim() return status === '' } // 检查是否有符合规范的提交(feat、fix 等) const hasConventionalCommits = () => { const lastTag = execSync('git describe --tags --abbrev=0', { stdio: 'pipe' }).toString().trim() const log = execSync(`git log ${lastTag}..HEAD --pretty=format:%s`, { stdio: 'pipe' }) .toString() .trim() return /^(feat|fix|docs|style|refactor|perf|test|chore)(\(.+\))?:/m.test(log) } // 1. 确保 changelog 文件存在 if (!fs.existsSync(changelogPath)) { console.log(`📄 检测到不存在 ${changelogPath},已自动创建空文件`) fs.writeFileSync(changelogPath, '', 'utf-8') } // 2. 检查 git 工作区 if (!isGitClean()) { console.error('❌ Git 工作区有未提交的改动,请先提交后再发版!') process.exit(1) } // 3. 检查是否有符合规范的提交 if (!hasConventionalCommits()) { console.error('⚠️ 没有检测到符合 Angular 提交规范的提交,跳过 changelog 生成!') process.exit(1) } // 4. 询问生成 changelog 的方式 const { mode } = await inquirer.prompt([ { type: 'list', name: 'mode', message: '请选择 changelog 生成方式:', choices: [ { name: '只追加日志(推荐)', value: 'incremental' }, { name: '全量生成日志(会覆盖原文件)', value: 'all' }, ], default: 'incremental', }, ]) // 5. 生成 changelog if (mode === 'all') { run('npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0') } else { run('npx conventional-changelog -p angular -i CHANGELOG.md -s') } // 6. 选择版本号类型 const { versionType } = await inquirer.prompt([ { type: 'list', name: 'versionType', message: '请选择版本号更新类型:', choices: [ { name: '补丁版本 (patch)', value: 'patch' }, { name: '小版本 (minor)', value: 'minor' }, { name: '大版本 (major)', value: 'major' }, { name: '自定义版本', value: 'custom' }, ], }, ]) if (versionType === 'custom') { const { customVersion } = await inquirer.prompt([ { type: 'input', name: 'customVersion', message: '请输入自定义版本号(例如 1.2.3):', validate: (input) => /^\d+\.\d+\.\d+$/.test(input) || '版本号格式不正确,请输入 x.y.z', }, ]) run(`npm version ${customVersion} -m "new version published: v%s"`) } else { run(`npm version ${versionType} -m "new version published: v%s"`) } // 7. 推送代码和 tag run('git push && git push --tags') console.log('✅ 发布完成!')