1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #!/usr/bin/env node
- import { execSync } from 'node:child_process'
- import fs from 'node:fs'
- const run = (cmd) => execSync(cmd, { stdio: 'inherit' })
- const out = (cmd) => execSync(cmd).toString().trim()
- console.log('\n🚀 发布流程开始...\n')
- // 1) 检查 Git 工作区是否干净
- if (out('git status --porcelain')) {
- 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) 是否全量生成 changelog
- const { changelogMode } = await inquirer.prompt([
- {
- type: 'list',
- name: 'changelogMode',
- message: '生成 CHANGELOG 模式:',
- choices: [
- { name: '只追加自上次发布以来的日志 (推荐)', value: 'append' },
- { name: '重新生成完整历史日志 (谨慎)', value: 'full' },
- ],
- default: 'append',
- },
- ])
- // 5) 升级版本号
- run(`npm version ${releaseType} -m "new version published: v%s"`)
- // 6) 生成或更新 CHANGELOG
- try {
- let cmd
- if (changelogMode === 'full') {
- cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0'
- } else {
- if (!fs.existsSync('CHANGELOG.md')) {
- console.log('📄 未检测到 CHANGELOG.md,正在初始化...')
- cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0'
- } else {
- cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s'
- }
- }
- run(cmd)
- // 提交 CHANGELOG
- if (/CHANGELOG\.md/.test(out('git status --porcelain'))) {
- run('git add CHANGELOG.md')
- run('git commit -m "docs: update changelog"')
- }
- } catch {
- console.warn(
- '⚠ 生成 changelog 失败:请确认已安装 conventional-changelog-cli(devDependencies)。'
- )
- }
- // 7) 推送代码与标签
- run('git push --follow-tags')
- console.log('\n🎉 发布完成!\n')
|