1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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('✅ 发布完成!')
|