简介:这份资源面向使用 Electron 进行桌面应用打包的开发者,尤其是初次接触 electron-builder 或打包流程频繁报错的人群。它汇集了 electron-v8.5.5-win32-x64、nsis-3.0.4.2 与 winCodeSign-2.6.0 三套关键依赖,用于补齐打包环境缺失的运行时、安装包制作工具与代码签名组件,解决因缓存目录不完整导致的构建失败问题。压缩包为 7z 格式,整体约 356.44MB,下载后可直接放入本地 electron 缓存目录使用。资源标签涵盖 electron、nsis 与 winCodeSign,对应打包链路中的核心环节。目前已有 1548 人学习下载,适合需要快速恢复打包环境、减少重复排查依赖缺失的开发者参考使用,能帮助读者省去逐项搜索与版本匹配的时间,更专注于应用本身的构建与发布流程。
1. 离线打包 Electron 全家桶:为什么你的 CI 一断网就翻车
很多团队第一次把 Electron 项目搬进内网构建机时,都会遇到同一个场景:本地npm run build一切正常,换到隔离环境或者 CI 上,electron-builder卡在下载环节,日志里反复出现electron-v8.5.5-win32-x64.zip、nsis-3.0.4.2.7z、winCodeSign-2.6.0.7z这几个文件名,然后超时退出。这不是网络抖动,而是 electron-builder 的默认行为——它把这三个二进制包当作外部依赖,运行时才去拉取,缓存目录一空就重新下载。
所谓「Electron 打包全家桶」,指的就是把这三样东西提前备齐、放进本地缓存或私有镜像,让打包过程彻底离线:electron-v8.5.5-win32-x64是 Electron 运行时本体,决定你打出来的 exe 里塞的是哪个版本的 Chromium 和 Node;nsis-3.0.4.2是 Windows 安装包生成器,负责把产物压成 setup.exe;winCodeSign-2.6.0提供 Windows 代码签名工具链,即使你不签名,electron-builder 也会调用它做部分资源处理。三者版本必须和 electron-builder 内部约定对齐,错一个就报校验失败。
这套方案适合两类人:一是构建环境不能访问外网的团队,二是被「每次打包都重新下载几百 MB」拖慢流水线的团队。下面按「先搞懂它去哪下、再动手把缓存填满、最后排掉那些玄学报错」的顺序讲透。
2. 三个包各自管什么:版本错配为什么直接报错
2.1 electron-v8.5.5-win32-x64 的角色与校验逻辑
Electron 的版本号里,8.5.5是 Electron 自身版本,win32-x64是目标平台架构。electron-builder 在打包时,会根据你package.json里devDependencies.electron的版本,去拼一个下载 URL,形如https://github.com/electron/electron/releases/download/v8.5.5/electron-v8.5.5-win32-x64.zip。下载完成后,它会用内置的SHASUMS256.txt校验文件哈希。
关键点在于:这个哈希是 electron-builder 版本绑定的,不是你随便找个同版本 zip 就能糊弄过去。如果你手动放进去的 zip 来源不同(比如从别的镜像站拉的、被重新压缩过的),哈希对不上,就会报sha256 checksum mismatch。所以离线包必须来自官方 release 的原始 zip,不能二次打包。
缓存目录的位置由环境变量决定,默认在用户目录下:
- Windows:
%LOCALAPPDATA%\electron\Cache - macOS:
~/Library/Caches/electron/ - Linux:
~/.cache/electron/
electron-builder 还会看ELECTRON_CACHE环境变量,如果设了就用它。CI 上常见做法是把缓存目录挂载成持久卷,或者用electron_config_cache指向项目内目录。
2.2 nsis-3.0.4.2 与 winCodeSign-2.6.0 的缓存路径差异
这两个包的缓存位置和 Electron 本体不一样,容易搞混。它们走的是 electron-builder 自己的缓存体系:
- Windows:
%LOCALAPPDATA%\electron-builder\Cache - macOS:
~/Library/Caches/electron-builder/ - Linux:
~/.cache/electron-builder/
在这个目录下,你会看到nsis/和winCodeSign/两个子目录。nsis 目录里通常有nsis-3.0.4.2和nsis-resources-3.4.1两个文件夹;winCodeSign 目录里是winCodeSign-2.6.0。
版本号必须和 electron-builder 内部app-builder期望的一致。比如 electron-builder 22.x 系列通常期望 nsis-3.0.4.2 和 winCodeSign-2.6.0,你放个 nsis-3.0.3 进去,它会重新下载或者直接报cannot find nsis。判断期望版本最可靠的办法是看一次在线打包的日志,日志里会打印它实际下载的 URL 和文件名。
提示:不要试图用「改文件名」的方式骗过校验。electron-builder 会检查目录内的文件结构,nsis 目录下必须有
Bin/makensis.exe等可执行文件,winCodeSign 目录下必须有windows-10/x64/signtool.exe等,缺一个都会失败。
2.3 用一张表理清三个包的缓存归属
| 包名 | 缓存根目录 | 子目录示例 | 校验方式 |
|---|---|---|---|
| electron-v8.5.5-win32-x64 | electron Cache | 直接放 zip 或解压目录 | SHA256 哈希 |
| nsis-3.0.4.2 | electron-builder Cache | nsis/nsis-3.0.4.2 | 目录结构 + 文件存在性 |
| winCodeSign-2.6.0 | electron-builder Cache | winCodeSign/winCodeSign-2.6.0 | 目录结构 + 文件存在性 |
这张表建议直接贴在构建机的 README 里,新人配环境时少走两小时弯路。
3. 手动填满缓存:从下载到校验的完整命令
3.1 准备目录结构与下载原始包
先在一台能联网的机器上把三个包下下来。注意 Electron 本体要下 zip,nsis 和 winCodeSign 要下 7z 压缩包。以下命令在 Linux/macOS 的 bash 下执行,Windows 用 PowerShell 对应替换即可。
# 创建工作目录 mkdir -p ~/electron-offline/{electron,nsis,winCodeSign} cd ~/electron-offline # 下载 Electron 本体(注意版本号和平台架构) # 这个 URL 是 electron-builder 默认会去拉的地址 curl -L -o electron/electron-v8.5.5-win32-x64.zip \ https://github.com/electron/electron/releases/download/v8.5.5/electron-v8.5.5-win32-x64.zip # 下载 nsis 和 winCodeSign # 这两个包的下载地址由 electron-builder 的 app-builder 决定 # 实际地址可以从一次在线打包的日志里复制 curl -L -o nsis/nsis-3.0.4.2.7z \ https://github.com/electron-userland/electron-builder-binaries/releases/download/nsis-3.0.4.2/nsis-3.0.4.2.7z curl -L -o winCodeSign/winCodeSign-2.6.0.7z \ https://github.com/electron-userland/electron-builder-binaries/releases/download/winCodeSign-2.6.0/winCodeSign-2.6.0.7z下载完成后,先别急着解压。用sha256sum算一下 Electron zip 的哈希,和官方SHASUMS256.txt里的值对一下。对不上就重新下,别抱侥幸心理。
# 校验 Electron zip 哈希 sha256sum electron/electron-v8.5.5-win32-x64.zip # 输出类似:a1b2c3... electron-v8.5.5-win32-x64.zip # 去 https://github.com/electron/electron/releases/tag/v8.5.5 页面找 SHASUMS256.txt 比对3.2 解压到正确的缓存路径并验证
nsis 和 winCodeSign 的 7z 包需要解压,而且解压后的目录名必须和包名一致。7z 在 Linux 上可以用p7zip,Windows 上用 7-Zip 图形界面或7z.exe。
# 解压 nsis 7z x nsis/nsis-3.0.4.2.7z -o/tmp/nsis-extract # 解压后通常会得到一个 nsis-3.0.4.2 目录 # 把它移动到 electron-builder 缓存目录 mkdir -p ~/.cache/electron-builder/nsis mv /tmp/nsis-extract/nsis-3.0.4.2 ~/.cache/electron-builder/nsis/ # 解压 winCodeSign 7z x winCodeSign/winCodeSign-2.6.0.7z -o/tmp/wcs-extract mkdir -p ~/.cache/electron-builder/winCodeSign mv /tmp/wcs-extract/winCodeSign-2.6.0 ~/.cache/electron-builder/winCodeSign/ # Electron 本体可以直接放 zip,也可以解压 # 推荐放 zip,让 electron-builder 自己解压,减少出错 mkdir -p ~/.cache/electron cp electron/electron-v8.5.5-win32-x64.zip ~/.cache/electron/放好之后,检查目录结构:
# 检查 nsis 目录 ls ~/.cache/electron-builder/nsis/nsis-3.0.4.2/ # 应该看到 Bin/、Contrib/、Docs/ 等目录,Bin 下有 makensis.exe # 检查 winCodeSign 目录 ls ~/.cache/electron-builder/winCodeSign/winCodeSign-2.6.0/ # 应该看到 windows-10/ 等目录,里面有 signtool.exe # 检查 electron 缓存 ls ~/.cache/electron/ # 应该看到 electron-v8.5.5-win32-x64.zip3.3 在 CI 里用环境变量锁定缓存路径
CI 环境每次都是新容器,缓存目录不持久。有两种做法:一是把缓存目录做成构建镜像的一部分,二是用环境变量指向项目内的目录,配合 CI 的缓存机制。
# 在 CI 脚本里设置环境变量 export ELECTRON_CACHE=$(pwd)/.cache/electron export ELECTRON_BUILDER_CACHE=$(pwd)/.cache/electron-builder # 然后执行打包 npm run buildELECTRON_CACHE控制 Electron 本体缓存,ELECTRON_BUILDER_CACHE控制 nsis 和 winCodeSign 缓存。这两个变量名容易记混,建议在 CI 配置里写注释。
注意:
ELECTRON_BUILDER_CACHE在部分旧版本里叫ELECTRON_BUILDER_CACHE,但有些文档写成ELECTRON_BUILDER_CACHE_DIR,实际不生效。以 electron-builder 源码里的getCacheDirectory函数为准,它读的是ELECTRON_BUILDER_CACHE。
4. 避坑排查:离线打包最常见的五类翻车
4.1 报错sha256 checksum mismatch但文件明明存在
现象:缓存目录里已经有electron-v8.5.5-win32-x64.zip,打包时仍然报哈希不匹配,然后尝试重新下载。
原因:这个 zip 不是官方原始文件。常见于从第三方镜像站下载、或者用浏览器下载时被中间层重新压缩过。electron-builder 校验的是官方SHASUMS256.txt里的哈希,任何改动都会导致不匹配。
解决:删掉缓存里的 zip,从官方 release 页面重新下载,下载后立即用sha256sum校验。如果官方页面访问不了,找能访问的同事下好之后通过内部文件共享传过来,传输过程用scp或内部制品库,不要用会改文件的工具。
4.2 nsis 目录存在但报cannot find makensis
现象:~/.cache/electron-builder/nsis/nsis-3.0.4.2目录明明在,打包时却报找不到makensis。
原因:解压时目录层级多了一层。比如 7z 解压后得到的是nsis-3.0.4.2/nsis-3.0.4.2/Bin/makensis.exe,而 electron-builder 期望的是nsis-3.0.4.2/Bin/makensis.exe。
解决:检查目录层级,把内层目录的内容移到外层。用find命令确认makensis.exe的实际路径:
find ~/.cache/electron-builder/nsis -name "makensis.exe" # 正确输出应该是 .../nsis-3.0.4.2/Bin/makensis.exe # 如果多了一层,手动 mv 调整4.3 winCodeSign 解压后缺少signtool.exe
现象:打包到最后签名阶段报signtool.exe not found,但 winCodeSign 目录存在。
原因:winCodeSign 的 7z 包里包含多个平台的工具,Windows 用的在windows-10/x64/下。如果解压不完整,或者杀毒软件把signtool.exe隔离了,就会缺文件。
解决:重新解压,解压时关闭杀毒软件实时防护,或者把缓存目录加入白名单。解压后确认:
ls ~/.cache/electron-builder/winCodeSign/winCodeSign-2.6.0/windows-10/x64/ # 应该看到 signtool.exe 等文件4.4 打包成功但安装包体积异常大
现象:离线打包出来的 setup.exe 比在线打包大了几十 MB。
原因:Electron 缓存目录里同时存在 zip 和解压后的目录,electron-builder 可能把两份都打进去了。或者 nsis 缓存目录里残留了旧版本的资源文件。
解决:清理缓存目录,只保留当前版本需要的文件。Electron 缓存里要么放 zip,要么放解压目录,不要两者都放。nsis 目录下只保留nsis-3.0.4.2和nsis-resources-3.4.1,其他版本删掉。
4.5 CI 上缓存挂载后权限不对导致写入失败
现象:CI 里把缓存目录挂载为持久卷,打包时报EACCES: permission denied。
原因:持久卷的属主和 CI 运行用户不一致。比如卷是 root 创建的,CI 以非 root 用户运行。
解决:在 CI 脚本开头加一行chown -R $(id -u):$(id -g) $CACHE_DIR,或者用sudo调整权限。更稳妥的做法是在 Dockerfile 里就把缓存目录建好并设好属主。
5. 进阶技巧:把离线包做成可复用的内部制品
5.1 用校验脚本在 CI 启动时自检缓存完整性
与其等打包到一半才报错,不如在 CI 第一步就跑一个自检脚本。下面这个 bash 脚本检查三个包的关键文件是否存在,不存在就提前失败并打印缺失项。
#!/usr/bin/env bash set -euo pipefail ELECTRON_CACHE="${ELECTRON_CACHE:-$HOME/.cache/electron}" EB_CACHE="${ELECTRON_BUILDER_CACHE:-$HOME/.cache/electron-builder}" missing=0 # 检查 Electron zip if [ ! -f "$ELECTRON_CACHE/electron-v8.5.5-win32-x64.zip" ]; then echo "MISSING: electron-v8.5.5-win32-x64.zip in $ELECTRON_CACHE" missing=1 fi # 检查 nsis if [ ! -f "$EB_CACHE/nsis/nsis-3.0.4.2/Bin/makensis.exe" ]; then echo "MISSING: nsis-3.0.4.2/Bin/makensis.exe in $EB_CACHE" missing=1 fi # 检查 winCodeSign if [ ! -f "$EB_CACHE/winCodeSign/winCodeSign-2.6.0/windows-10/x64/signtool.exe" ]; then echo "MISSING: winCodeSign-2.6.0/windows-10/x64/signtool.exe in $EB_CACHE" missing=1 fi if [ "$missing" -eq 1 ]; then echo "Cache check failed. Please populate the cache before building." exit 1 fi echo "Cache check passed."这个脚本的关键在于set -euo pipefail,任何一步失败都立即退出,不会带着残缺缓存继续跑。ELECTRON_CACHE和ELECTRON_BUILDER_CACHE用默认值兜底,CI 里如果设了环境变量就用 CI 的。
5.2 把三个包打包成内部制品并写清版本对应关系
如果团队有多台构建机,手动拷贝容易漏。建议把三个包打成一个 tar 包,放到内部制品库,版本号里带上 electron-builder 的版本。比如electron-offline-bundle-22.10.5.tar.gz,解压后目录结构就是缓存目录的结构。
# 打包缓存目录 tar -czf electron-offline-bundle-22.10.5.tar.gz \ -C ~/.cache electron/electron-v8.5.5-win32-x64.zip \ -C ~/.cache/electron-builder nsis/nsis-3.0.4.2 winCodeSign/winCodeSign-2.6.0 # 在目标机器上解压到缓存目录 tar -xzf electron-offline-bundle-22.10.5.tar.gz -C ~/.cache/版本对应关系建议写在一个versions.json里,和制品一起发布:
{ "electron-builder": "22.10.5", "electron": "8.5.5", "nsis": "3.0.4.2", "winCodeSign": "2.6.0" }这样下次升级 electron-builder 时,对照这个文件就知道要不要换 nsis 和 winCodeSign。
5.3 一个容易忽略的细节:nsis-resources 也要备
很多人只备了nsis-3.0.4.2,忘了nsis-resources-3.4.1。这个包提供安装界面的图标、语言文件等资源,缺了它打包可能不报错,但生成的安装包界面会变成默认的英文丑界面,或者直接失败。检查方法:
ls ~/.cache/electron-builder/nsis/ # 应该同时看到 nsis-3.0.4.2 和 nsis-resources-3.4.1如果只有前者,从在线打包日志里找到nsis-resources-3.4.1.7z的下载地址,下下来解压到同一目录。
我自己的习惯是:每次升级 electron-builder 后,先在一台能联网的机器上完整跑一次打包,把日志里所有下载 URL 和文件名记下来,然后按这个清单更新离线包。这个习惯帮我省掉了至少三次「以为版本没变结果缓存对不上」的返工。希望帮到你。
本文还有配套的精品资源,点击获取