buildPlugin.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //plugins\buildPlugin.ts
  2. import path from "path";
  3. import fs from "fs-extra";
  4. class BuildObj {
  5. //编译主进程代码
  6. buildMain() {
  7. require("esbuild").buildSync({
  8. entryPoints: ["./src/main/mainEntry.ts"],
  9. bundle: true,
  10. platform: "node",
  11. minify: true,
  12. outfile: "./dist/mainEntry.js",
  13. external: ["electron", "pg", "tedious", "mysql", "mysql2", "oracledb", "pg-query-stream", "sqlite3"],
  14. });
  15. }
  16. async prepareSqlite() {
  17. //拷贝better-sqlite3
  18. let srcDir = path.join(process.cwd(), `node_modules/better-sqlite3`);
  19. let destDir = path.join(process.cwd(), `dist/node_modules/better-sqlite3`);
  20. fs.ensureDirSync(destDir);
  21. fs.copySync(srcDir, destDir, {
  22. filter: (src) => {
  23. if (src.endsWith("better-sqlite3") || src.endsWith("build") || src.endsWith("Release") || src.endsWith("better_sqlite3.node")) return true;
  24. else if (src.includes("node_modules\\better-sqlite3\\lib")) return true;
  25. else return false;
  26. },
  27. });
  28. let pkgJson = `{"name": "better-sqlite3","main": "lib/index.js"}`;
  29. let pkgJsonPath = path.join(process.cwd(), `dist/node_modules/better-sqlite3/package.json`);
  30. fs.writeFileSync(pkgJsonPath, pkgJson);
  31. //制作bindings模块
  32. let bindingPath = path.join(process.cwd(), `dist/node_modules/bindings/index.js`);
  33. fs.ensureFileSync(bindingPath);
  34. let bindingsContent = `module.exports = () => {
  35. let addonPath = require("path").join(__dirname, '../better-sqlite3/build/Release/better_sqlite3.node');
  36. return require(addonPath);
  37. };`;
  38. fs.writeFileSync(bindingPath, bindingsContent);
  39. pkgJson = `{"name": "bindings","main": "index.js"}`;
  40. pkgJsonPath = path.join(process.cwd(), `dist/node_modules/bindings/package.json`);
  41. fs.writeFileSync(pkgJsonPath, pkgJson);
  42. }
  43. prepareKnexjs() {
  44. let pkgJsonPath = path.join(process.cwd(), `dist/node_modules/knex`);
  45. fs.ensureDirSync(pkgJsonPath);
  46. require("esbuild").buildSync({
  47. entryPoints: ["./node_modules/knex/knex.js"],
  48. bundle: true,
  49. platform: "node",
  50. format: "cjs",
  51. minify: true,
  52. outfile: "./dist/node_modules/knex/index.js",
  53. external: ["oracledb", "pg-query-stream", "pg", "sqlite3", "tedious", "mysql", "mysql2", "better-sqlite3"],
  54. });
  55. let pkgJson = `{"name": "bindings","main": "index.js"}`;
  56. pkgJsonPath = path.join(process.cwd(), `dist/node_modules/knex/package.json`);
  57. fs.writeFileSync(pkgJsonPath, pkgJson);
  58. }
  59. //为生产环境准备package.json
  60. preparePackageJson() {
  61. let pkgJsonPath = path.join(process.cwd(), "package.json");
  62. let localPkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
  63. let electronConfig = localPkgJson.devDependencies.electron.replace("^", "");
  64. localPkgJson.main = "mainEntry.js";
  65. delete localPkgJson.scripts;
  66. delete localPkgJson.devDependencies;
  67. localPkgJson.devDependencies = { electron: electronConfig };
  68. let tarJsonPath = path.join(process.cwd(), "dist", "package.json");
  69. fs.writeFileSync(tarJsonPath, JSON.stringify(localPkgJson));
  70. fs.mkdirSync(path.join(process.cwd(), "dist/node_modules"));
  71. }
  72. //使用electron-builder制成安装包
  73. buildInstaller() {
  74. let options = {
  75. config: {
  76. directories: {
  77. output: path.join(process.cwd(), "release"),
  78. app: path.join(process.cwd(), "dist"),
  79. },
  80. files: ["**"],
  81. extends: null,
  82. productName: "fc-ele",
  83. appId: "com.fcele.kindring.cn",
  84. asar: true,
  85. nsis: {
  86. oneClick: true,
  87. perMachine: true,
  88. allowToChangeInstallationDirectory: false,
  89. createDesktopShortcut: true,
  90. createStartMenuShortcut: true,
  91. shortcutName: "fc-ele",
  92. },
  93. publish: [{ provider: "generic", url: "http://localhost:5500/" }],
  94. extraResources: [{ from: `./db.db`, to: `./` }],
  95. },
  96. project: process.cwd(),
  97. };
  98. return require("electron-builder").build(options);
  99. }
  100. }
  101. export let buildPlugin = () => {
  102. return {
  103. name: "build-plugin",
  104. closeBundle: () => {
  105. let buildObj = new BuildObj();
  106. buildObj.prepareSqlite();
  107. buildObj.buildMain();
  108. buildObj.preparePackageJson();
  109. buildObj.buildInstaller();
  110. buildObj.prepareKnexjs();
  111. },
  112. };
  113. };