فهرست منبع

fix(scripts): #255 改进 postupgrade.js 使用 Promise 和日志控制

将回调方式的 exec 改为 Promise 形式,增加日志控制开关
添加串行卸载依赖功能,统计成功和失败数量
feige996 8 ماه پیش
والد
کامیت
435fa3e9cc
1فایلهای تغییر یافته به همراه77 افزوده شده و 11 حذف شده
  1. 77 11
      scripts/postupgrade.js

+ 77 - 11
scripts/postupgrade.js

@@ -2,7 +2,14 @@
 // # 在升级完后,会自动添加很多无用依赖,这需要删除以减小依赖包体积
 // # 只需要执行下面的命令即可
 
-const { exec } = require('node:child_process')
+import { exec } from 'node:child_process'
+import { promisify } from 'node:util'
+
+// 日志控制开关,设置为 true 可以启用所有日志输出
+const FG_LOG_ENABLE = true
+
+// 将 exec 转换为返回 Promise 的函数
+const execPromise = promisify(exec)
 
 // 定义要执行的命令
 const dependencies = [
@@ -21,15 +28,74 @@ const dependencies = [
   'vue-i18n',
 ]
 
-// 使用exec执行命令
-exec(`pnpm un ${dependencies.join(' ')}`, (error, stdout, stderr) => {
-  if (error) {
-    // 如果有错误,打印错误信息
-    console.error(`执行出错: ${error}`)
-    return
+/**
+ * 带开关的日志输出函数
+ * @param {string} message 日志消息
+ * @param {string} type 日志类型 (log, error)
+ */
+function log(message, type = 'log') {
+  if (FG_LOG_ENABLE) {
+    if (type === 'error') {
+      console.error(message)
+    }
+    else {
+      console.log(message)
+    }
+  }
+}
+
+/**
+ * 卸载单个依赖包
+ * @param {string} dep 依赖包名
+ * @returns {Promise<boolean>} 是否成功卸载
+ */
+async function uninstallDependency(dep) {
+  try {
+    log(`开始卸载依赖: ${dep}`)
+    const { stdout, stderr } = await execPromise(`pnpm un ${dep}`)
+    if (stdout) {
+      log(`stdout [${dep}]: ${stdout}`)
+    }
+    if (stderr) {
+      log(`stderr [${dep}]: ${stderr}`, 'error')
+    }
+    log(`成功卸载依赖: ${dep}`)
+    return true
+  }
+  catch (error) {
+    // 单个依赖卸载失败不影响其他依赖
+    log(`卸载依赖 ${dep} 失败: ${error.message}`, 'error')
+    return false
+  }
+}
+
+/**
+ * 串行卸载所有依赖包
+ */
+async function uninstallAllDependencies() {
+  log(`开始串行卸载 ${dependencies.length} 个依赖包...`)
+
+  let successCount = 0
+  let failedCount = 0
+
+  // 串行执行所有卸载命令
+  for (const dep of dependencies) {
+    const success = await uninstallDependency(dep)
+    if (success) {
+      successCount++
+    }
+    else {
+      failedCount++
+    }
+
+    // 为了避免命令执行过快导致的问题,添加短暂延迟
+    await new Promise(resolve => setTimeout(resolve, 100))
   }
-  // 打印正常输出
-  console.log(`stdout: ${stdout}`)
-  // 如果有错误输出,也打印出来
-  console.error(`stderr: ${stderr}`)
+
+  log(`卸载操作完成: 成功 ${successCount} 个, 失败 ${failedCount} 个`)
+}
+
+// 执行串行卸载
+uninstallAllDependencies().catch((err) => {
+  log(`串行卸载过程中出现未捕获的错误: ${err}`, 'error')
 })