//plugins\buildPlugin.ts import path from "path"; import fs from "fs-extra"; class BuildObj { //编译主进程代码 buildMain() { require("esbuild").buildSync({ entryPoints: ["./src/main/mainEntry.ts"], bundle: true, platform: "node", minify: true, outfile: "./dist/mainEntry.js", external: ["electron", "pg", "tedious", "mysql", "mysql2", "oracledb", "pg-query-stream", "sqlite3"], }); } //为生产环境准备package.json preparePackageJson() { let pkgJsonPath = path.join(process.cwd(), "package.json"); let localPkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8")); let electronConfig = localPkgJson.devDependencies.electron.replace("^", ""); localPkgJson.main = "mainEntry.js"; delete localPkgJson.scripts; delete localPkgJson.devDependencies; localPkgJson.devDependencies = { electron: electronConfig }; let tarJsonPath = path.join(process.cwd(), "dist", "package.json"); fs.writeFileSync(tarJsonPath, JSON.stringify(localPkgJson)); fs.mkdirSync(path.join(process.cwd(), "dist/node_modules")); } async prepareSqlite() { //拷贝better-sqlite3 let srcDir = path.join(process.cwd(), `node_modules/better-sqlite3`); let destDir = path.join(process.cwd(), `dist/node_modules/better-sqlite3`); fs.ensureDirSync(destDir); console.log(srcDir, destDir); fs.copySync(srcDir, destDir, { filter: (src) => { if (src.endsWith("better-sqlite3") || src.endsWith("build") || src.endsWith("Release") || src.endsWith("better_sqlite3.node")) return true; else if (src.includes("node_modules\\better-sqlite3\\lib")) return true; else return false; }, }); // 拷贝build目录 srcDir = path.join(process.cwd(), `node_modules/better-sqlite3/build`); destDir = path.join(process.cwd(), `dist/build`); fs.ensureDirSync(destDir); fs.copySync(srcDir, destDir); let pkgJson = `{"name": "better-sqlite3","main": "lib/index.js"}`; let pkgJsonPath = path.join(process.cwd(), `dist/node_modules/better-sqlite3/package.json`); fs.writeFileSync(pkgJsonPath, pkgJson); //制作bindings模块 let bindingPath = path.join(process.cwd(), `dist/node_modules/bindings/index.js`); fs.ensureFileSync(bindingPath); let bindingsContent = `module.exports = () => { let addonPath = require("path").join(__dirname, '../better-sqlite3/build/Release/better_sqlite3.node'); return require(addonPath); };`; fs.writeFileSync(bindingPath, bindingsContent); pkgJson = `{"name": "bindings","main": "index.js"}`; pkgJsonPath = path.join(process.cwd(), `dist/node_modules/bindings/package.json`); fs.writeFileSync(pkgJsonPath, pkgJson); } prepareKnexjs() { let pkgJsonPath = path.join(process.cwd(), `dist/node_modules/knex`); fs.ensureDirSync(pkgJsonPath); require("esbuild").buildSync({ entryPoints: ["./node_modules/knex/knex.js"], bundle: true, platform: "node", format: "cjs", minify: true, outfile: "./dist/node_modules/knex/index.js", external: ["oracledb", "pg-query-stream", "pg", "sqlite3", "tedious", "mysql", "mysql2", "better-sqlite3"], }); let pkgJson = `{"name": "bindings","main": "index.js"}`; pkgJsonPath = path.join(process.cwd(), `dist/node_modules/knex/package.json`); fs.writeFileSync(pkgJsonPath, pkgJson); } //使用electron-builder制成安装包 buildInstaller() { let options = { config: { directories: { output: path.join(process.cwd(), "release"), app: path.join(process.cwd(), "dist"), }, files: ["**"], extends: null, productName: "fc-ele", appId: "com.fcele.kindring.cn", asar: true, nsis: { oneClick: true, perMachine: true, allowToChangeInstallationDirectory: false, createDesktopShortcut: true, createStartMenuShortcut: true, shortcutName: "fc-ele", }, publish: [{ provider: "generic", url: "http://localhost:5500/" }], extraResources: [ { from: `./db.db`, to: `./` }, { from: `./logo.ico`, to: `./` }, ], }, project: process.cwd(), }; return require("electron-builder").build(options); } } export let buildPlugin = () => { return { name: "build-plugin", closeBundle: () => { let buildObj = new BuildObj(); buildObj.buildMain(); buildObj.preparePackageJson(); buildObj.prepareSqlite(); buildObj.buildInstaller(); buildObj.prepareKnexjs(); }, }; };