You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Yarn Workspaces环境下打包Electron Forge应用?

Yarn Workspaces + Electron Forge 打包解决方案

针对你拆分的Electron多工作区场景(server/gui/app),打包时的依赖缺失、符号链接权限问题,可以通过以下步骤解决:

1. 精准配置Yarn Workspaces的Nohoist规则

不要全局设置"nohoist": ["**"],这会导致所有依赖都分散在各工作区的node_modules,反而引发Electron Builder的符号链接处理问题。只针对Electron相关核心包做非hoist处理,在根目录的package.json中修改:

"workspaces": {
  "packages": ["packages/*"], // 对应你的server、gui、app工作区目录
  "nohoist": [
    "**/electron",
    "**/electron-forge-*",
    "**/electron-builder",
    "**/electron-squirrel-startup"
  ]
}

这样既保留Yarn Workspaces的依赖hoist优势,又避免Electron核心包因被hoist到根目录而导致打包时找不到的问题。

2. 规范app工作区的依赖声明

在app工作区的package.json中,确保本地工作区依赖用workspace:*声明,同时显式添加electron-squirrel-startup这类打包必需的依赖:

"dependencies": {
  "server": "workspace:*",
  "gui": "workspace:*",
  "electron-squirrel-startup": "^1.0.0"
},
"scripts": {
  "package": "electron-forge package",
  "make": "electron-forge make"
}

另外,所有工作区包(server、gui、app)都要设置"private": true,避免Yarn误将其识别为可发布包。

3. 用Forge钩子替换工作区符号链接

Electron Builder会直接复制Yarn生成的工作区符号链接,导致Windows下的EPERM权限错误。可以通过prePackage钩子,将server和gui的源码复制到app的node_modules目录(替换符号链接):
在app工作区的forge.config.js中添加:

const fs = require('fs-extra');
const path = require('path');

module.exports = {
  // 其他原有配置...
  packagerConfig: {
    asar: true, // 开启asar打包,减少文件数量并规避权限问题
    prune: true // 自动移除devDependencies,确保生产包干净
  },
  hooks: {
    prePackage: async () => {
      // 复制server源码到app的node_modules/server
      await fs.copy(
        path.resolve(__dirname, '../server'),
        path.resolve(__dirname, 'node_modules/server'),
        {
          overwrite: true,
          filter: (src) => !src.includes('node_modules') && !src.includes('.git')
        }
      );
      // 复制gui源码(如果gui需要先构建,先执行yarn workspace gui run build,再复制产物)
      await fs.copy(
        path.resolve(__dirname, '../gui'),
        path.resolve(__dirname, 'node_modules/gui'),
        {
          overwrite: true,
          filter: (src) => !src.includes('node_modules') && !src.includes('.git')
        }
      );
    }
  }
};

如果gui是前端项目(如React/Vue),需要先在prePackage钩子中执行gui的构建命令,再复制构建产物到app的静态资源目录(比如app/public)。

4. 标准化打包流程

  1. 在根目录执行yarn install,确保所有依赖安装完成
  2. 执行yarn workspace app run package进行测试打包
  3. 若需生成安装包,执行yarn workspace app run make

常见坑规避

  • 不要在打包过程中额外执行yarn install --production,Electron Forge的prune: true会自动处理生产依赖
  • 确保server和gui的代码中没有硬编码的路径引用,避免打包后路径错误

内容的提问来源于stack exchange,提问作者Joe Jankowiak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:20:12