本地环境:pnpm v10 、 electron v30 、 electron-build v24
Electron failed to install correctly, please delete node_modules/electron and try installing again
解决方案 1
尝试手动执行安装
node node_modules/electron/install.js
解决方案 2(推荐!)
在 pageage.json 中添加以下配置:
"pnpm": {
"onlyBuiltDependencies": ["electron"]
},
或者在 .npmrc 里添加以下配置:
only-built-dependencies=electron
根本原因
这是 pnpm v10 的新特性,为了提升依赖管理的安全性,只有在 onlyBuiltDependencies 里列出的包才允许在安装期间内执行脚本。
dev无报错,打包无报错,但是运行App报错:cannot find module xxx
解决方案
step 1:确保被主进程引用的依赖都在 dependencies 内,而不是在 devDependencies。
step 2:在 .npmrc 中添加以下配置:
node-linker=hoisted
// or
shamefully-hoist=true
根本原因
electron-builder 的打包机制是罪魁祸首。在构建最终的可执行应用时,electron-builder 会遍历 node_modules 目录,找出 dependencies 所需要的模块,并把它们打包进最终的包(比如 asar 包)中。
而 pnpm 的特点是软链接 + 硬链接 + 非扁平化管理依赖,它的 node_modules 只包含 package.json 中明确声明的依赖(解决幽灵依赖)。且它通过硬链接(.pnpm)的方式来节省磁盘资源。
因此 pnpm + electron-builder 无法正确的把 node_modules 的依赖打进最终包,解决方案就是放弃 pnpm 的特性,生成一个扁平的 node_modules。
同时期待electron-builder 能解决寻找软连接、硬链接的依赖包的问题,这样我们就可以继续维持 pnpm 节省磁盘资源的特性。