Electron 打包常见问题
最近在搞一个 Electron 项目(NeFour),功能开发都很顺,到了最后生成 .exe 安装包的时候,差点被气死。
明明 pnpm run dev 跑得欢快得很,一执行 pnpm run dist 就给我甩脸子。
折腾了一下午,总算是搞定了。记录一下这个坑,希望能帮到同样问题的兄弟们。
1. 案发现场
运行 electron-builder 打包时,控制台直接红了一大片。
最开始的报错是这样的:
⨯ cannot execute cause=exec: "...\.eb-cache\winCodeSign\winCodeSign-2.6.0\rcedit-x64.exe": file does not exist
乍一看以为是文件丢失,我寻思我网络也没问题啊,它不是会自动下载依赖吗?
仔细往前翻日志,才发现真正的凶手在前面解压的那一步:
Cannot create symbolic link : insufficient privileges : ...\darwin\10.12\lib\libcrypto.dylib2. 原因分析
这其实是 Windows 系统机制和开源工具包的一个“八字不合”。
- electron-builder 为了给 Windows 应用签名,会自动下载一个叫
winCodeSign的工具包。 - 这个压缩包里有点“贪心”,不仅放了 Windows 的工具,还把 macOS (darwin) 和 Linux 的工具也都塞进去了。
- 关键点来了:macOS 文件夹里包含了很多符号链接 (Symbolic Links)。
- 在 Windows 上,普通用户权限默认是不允许创建符号链接的(这需要管理员权限或者开发者模式)。
所以流程就变成了:下载成功 -> 解压到一半 -> 碰到 macOS 的符号链接 -> 权限不足报错 -> 解压中断 -> rcedit.exe 没解压出来 -> 打包失败。
无语了:我在 Windows 上打包 Windows 应用,为啥要因为解压不了 macOS 的文件而报错?
3. 解决方案
既然自动解压不行,那就手动来
第一步:手动下载依赖包
别指望它自动重试了,直接手动把包下载下来。我看日志里它想下的是 winCodeSign-2.6.0。
下载地址一般在淘宝镜像或者 GitHub 上,下个 7z 格式的包。
第二步:定向解压(关键操作)
不能直接右键解压,因为直接解压还是会因为那个符号链接报错。我们需要用命令行解压,并且告诉解压工具:“把那个该死的 darwin (macOS) 文件夹给我扔了!”
用 PowerShell在项目根目录下操作的 敲了这几行命令:
# 1. 创建缓存目录(electron-builder 默认找这个位置)
mkdir .eb-cache\winCodeSign\winCodeSign-2.6.0
# 2. 解压,重点是 -xr!darwin 这个参数,意思是排除 darwin 目录
# 这里的路径根据你自己电脑调整
7za.exe x winCodeSign.7z -o".eb-cache\winCodeSign\winCodeSign-2.6.0" -xr!darwin -aoa执行完这步,那个会导致报错的 macOS 文件夹就被过滤掉了,只留下了我们要用的 Windows 工具。
第三步:配置环境变量(可选但推荐)
为了保险起见,告诉 electron-builder 优先用我们刚才准备好的本地缓存,别再去网上瞎下载了:
$env:ELECTRON_BUILDER_CACHE="你的项目路径\.eb-cache"额外插曲:文件被占用
解决完签名工具的问题后,我又遇到了个经典报错:The process cannot access the file because it is being used by another process.
这是因为之前的打包失败,导致 release 文件夹里有些文件被某些进程(可能是杀毒软件,也可能是资源管理器)死死锁住了,删都删不掉。
这时候别硬刚,直接改 package.json,换个输出目录最省事:
"build": {
"directories": {
"output": "release_new"
}
}4. 结果
再次运行 pnpm run dist,一路绿灯,Setup.exe 顺利生成
总结一下:Windows 打包如果遇到 insufficient privileges 或者 symbolic link 错误,多半是解压跨平台包时权限不够。直接手动解压并排除掉非 Windows 的目录,通常就能解决。
希望能帮到大家少掉几根头发。
