Kaynağa Gözat

feat(scripts): 增强发布脚本功能并优化代码

- 新增 changelog 生成模式选择功能,支持增量或全量生成
- 优化 git 工作区检查逻辑,简化代码
- 改进 changelog 提交检测逻辑,避免空提交
- 添加 changelog 文件存在性检查,自动初始化
liujia 2 ay önce
ebeveyn
işleme
adbef79912
1 değiştirilmiş dosya ile 37 ekleme ve 12 silme
  1. 37 12
      scripts/release.js

+ 37 - 12
scripts/release.js

@@ -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')