const { execSync, spawn } = require('child_process') const path = require('path') const fs = require('fs') function runElectronBuilder(cwd, env) { const binName = process.platform === 'win32' ? 'electron-builder.cmd' : 'electron-builder' const electronBuilderBin = path.join(cwd, 'node_modules', '.bin', binName) if (!fs.existsSync(electronBuilderBin)) { return Promise.reject(new Error('未找到 electron-builder,请先在项目根目录执行 npm install。')) } return new Promise((resolve, reject) => { const args = ['--win', '--arm64'] const opts = { cwd, stdio: ['inherit', 'inherit', 'inherit'], env: { ...process.env, ...env, DEBUG: 'electron-builder' }, windowsHide: false } if (process.platform === 'win32') { opts.shell = true } const child = spawn(electronBuilderBin, args, opts) let elapsed = 0 const progressInterval = setInterval(() => { elapsed += 10 console.log(` → 打包进行中... (已等待 ${elapsed} 秒,请勿关闭)`) }, 10000) child.on('close', (code) => { clearInterval(progressInterval) if (code !== 0) { const err = new Error(`electron-builder 退出码: ${code}`) err.exitCode = code reject(err) } else resolve() }) child.on('error', (err) => { clearInterval(progressInterval) reject(err) }) }) } const projectRoot = path.resolve(__dirname, '..') const distDir = path.join(projectRoot, 'dist') function cleanDist(keepDir) { if (!fs.existsSync(distDir)) return for (const name of fs.readdirSync(distDir)) { if (name === keepDir) continue const full = path.join(distDir, name) try { if (fs.statSync(full).isDirectory()) fs.rmSync(full, { recursive: true }) else fs.unlinkSync(full) } catch (e) { console.warn('clean:', e.message) } } } async function main() { const keepDir = 'win-arm64-unpacked' try { console.log('[1/3] Vite build...') execSync('npm run build', { cwd: projectRoot, stdio: 'inherit' }) } catch (e) { console.error('\n[错误] 第 1 步 Vite build 失败,已停止打包。') console.error(e.message || e) process.exit(1) } try { console.log('[2/3] Electron builder win arm64...(每 10 秒会打印进度,请勿关闭)') await runElectronBuilder(projectRoot, {}) } catch (e) { console.error('\n[错误] 第 2 步 electron-builder 失败,已停止打包。') console.error(e.message || e) process.exit(1) } try { console.log('[3/3] 清理 dist,只保留 win-arm64-unpacked...') cleanDist(keepDir) console.log('Done. Output: dist\\win-arm64-unpacked') } catch (e) { console.error('\n[错误] 第 3 步 清理 dist 失败。') console.error(e.message || e) process.exit(1) } } if (require.main === module) { main().catch((e) => { console.error(e) process.exit(1) }) } else { module.exports = { cleanDist } }