const fs = require('fs'); const path = require('path'); const ROOT = __dirname; const pkg = require('./package.json'); const OUT = process.env.PEOPLELIB_OUT_DIR ? path.resolve(process.env.PEOPLELIB_OUT_DIR) : path.join(ROOT, 'dist', `PeopleLib-${pkg.version}`); const APP = path.join(OUT, 'resources', 'app'); const PRODUCT = 'PeopleLib'; function rimraf(p) { if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true }); } function copyDir(src, dst, skip) { fs.mkdirSync(dst, { recursive: true }); for (const e of fs.readdirSync(src, { withFileTypes: true })) { if (skip && skip(e)) continue; const s = path.join(src, e.name); const d = path.join(dst, e.name); if (e.isDirectory()) copyDir(s, d, skip); else fs.copyFileSync(s, d); } } function pruneLocales(dir) { const keep = new Set(['zh-CN.pak', 'en-US.pak']); for (const name of fs.readdirSync(dir)) { if (!keep.has(name)) fs.unlinkSync(path.join(dir, name)); } } function skipDevFiles(e) { const name = e.name.toLowerCase(); if (e.isDirectory()) return false; if (/\.(d\.ts|d\.ts\.map|ts|tsx|map|flow)$/.test(name)) return true; if (/^(readme|changelog|history|license|licence|notice|authors|contributing|security)/.test(name)) return true; if (/\.(md|markdown)$/.test(name)) return true; return false; } function copyUndici(dst) { const src = path.join(ROOT, 'node_modules', 'undici'); fs.mkdirSync(dst, { recursive: true }); for (const name of ['package.json', 'index.js', 'index-fetch.js', 'LICENSE']) { const file = path.join(src, name); if (fs.existsSync(file)) fs.copyFileSync(file, path.join(dst, name)); } copyDir(path.join(src, 'lib'), path.join(dst, 'lib'), skipDevFiles); } console.log('清理输出目录...'); rimraf(OUT); console.log('复制 Electron 运行时...'); copyDir(path.join(ROOT, 'node_modules', 'electron', 'dist'), OUT); console.log('精简语言包...'); pruneLocales(path.join(OUT, 'locales')); console.log('重命名可执行文件...'); fs.renameSync(path.join(OUT, 'electron.exe'), path.join(OUT, PRODUCT + '.exe')); rimraf(path.join(OUT, 'resources', 'default_app.asar')); console.log('组装 app 源码...'); fs.mkdirSync(APP, { recursive: true }); fs.copyFileSync(path.join(ROOT, 'main.js'), path.join(APP, 'main.js')); fs.copyFileSync(path.join(ROOT, 'preload.js'), path.join(APP, 'preload.js')); copyDir(path.join(ROOT, 'src'), path.join(APP, 'src'), (e) => e.name.startsWith('_test')); copyUndici(path.join(APP, 'node_modules', 'undici')); fs.writeFileSync(path.join(APP, 'package.json'), JSON.stringify({ name: pkg.name, version: pkg.version, description: pkg.description, main: 'main.js', author: pkg.author, license: pkg.license, dependencies: { undici: pkg.dependencies.undici } }, null, 2)); console.log('\n构建完成:'); console.log(' 目录:', OUT); console.log(' 可执行文件:', path.join(OUT, PRODUCT + '.exe'));