/** * 扫描根 package.json + 所有 workspace 子包的 dependencies/optionalDependencies, * 找出 workspace 子包引用但根 package.json 没声明的运行时依赖(hoist 到根 node_modules 了)。 * * 这些包 electron-builder 收集器看不到(它只读根 package.json), * 会导致打包后 MODULE_NOT_FOUND。需要加到根 package.json 里。 */ const fs = require("node:fs"); const path = require("node:path"); const rootDir = path.resolve(__dirname, ".."); const rootPkg = JSON.parse(fs.readFileSync(path.join(rootDir, "package.json"), "utf-8")); // workspace 配置 let globs = rootPkg.workspace || rootPkg.pnpm?.packages || ["packages/*"]; if (!Array.isArray(globs)) globs = ["packages/*"]; const rootRuntime = { ...rootPkg.dependencies, ...rootPkg.optionalDependencies }; const subRuntime = {}; // 子包独有的运行时依赖 → 版本 for (const g of globs) { const dir = path.join(rootDir, g.replace("/*", "")); if (!fs.existsSync(dir)) continue; const entries = fs.readdirSync(dir, { withFileTypes: true }); for (const e of entries) { if (!e.isDirectory()) continue; const pkgPath = path.join(dir, e.name, "package.json"); if (!fs.existsSync(pkgPath)) continue; const pkgJson = JSON.parse(fs.readFileSync(pkgPath, "utf-8")); const deps = { ...pkgJson.dependencies, ...pkgJson.optionalDependencies }; for (const [name, version] of Object.entries(deps)) { if (!rootRuntime[name] && !subRuntime[name]) { subRuntime[name] = version; } } } } const missingRootDeps = Object.keys(subRuntime); console.log("子包独有的运行时依赖(根 package.json 没声明):"); console.log(" 数量:", missingRootDeps.length); console.log(" 列表:", missingRootDeps.join(", ")); console.log(""); console.log("根 package.json 已有运行时依赖:", Object.keys(rootRuntime).length); console.log(""); console.log("建议加到根 package.json.dependencies 的条目:"); console.log(JSON.stringify(subRuntime, null, 2));