|
@@ -1,20 +1,19 @@
|
|
|
#!/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) 必须保证工作区干净
|
|
|
-const dirty = out('git status --porcelain')
|
|
|
-if (dirty) {
|
|
|
+// 1) 检查 Git 工作区是否干净
|
|
|
+if (out('git status --porcelain')) {
|
|
|
console.error('❌ Git 工作区有未提交的改动,请先提交后再发版!\n')
|
|
|
process.exit(1)
|
|
|
}
|
|
|
|
|
|
-// 2) 动态导入 inquirer(避免依赖问题在早期就报错)
|
|
|
+// 2) 动态导入 inquirer
|
|
|
const inquirer = (await import('inquirer')).default
|
|
|
|
|
|
// 3) 选择版本类型
|
|
@@ -31,15 +30,41 @@ const { releaseType } = await inquirer.prompt([
|
|
|
},
|
|
|
])
|
|
|
|
|
|
-// 4) 升级版本号(带 tag 与提交信息)
|
|
|
+// 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"`)
|
|
|
|
|
|
-// 5) 生成/更新 CHANGELOG(增量)
|
|
|
+// 6) 生成或更新 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)) {
|
|
|
+ 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"')
|
|
|
}
|
|
@@ -49,7 +74,7 @@ try {
|
|
|
)
|
|
|
}
|
|
|
|
|
|
-// 6) 推送代码与标签
|
|
|
+// 7) 推送代码与标签
|
|
|
run('git push --follow-tags')
|
|
|
|
|
|
console.log('\n🎉 发布完成!\n')
|