1. 需求
开发了一个electron项目的包,之前一直是在windows上运行,随着国际局势紧张,公司要求适配一下国产化系统。需要输出linux arm64版本的deb包,在统信和麒麟V10上面可以跑起来。
2. 环境准备
本来准备直接在windows上面打包,结果发现不行,想打linux的包,必须有对应的操作系统才行。结果公司里面都是x86的机器,没有一台arm64的电脑。最后找了一台华为云linux arm64的服务器作为打包环境。
2.1. 安装Git
服务器是centos7系统,安装Git命令。
yum install git
直接通过git clone 拉取对应的代码即可。
2.2. Node环境安装
打开NodeJS下载链接,建议使用Nvm或者Fnm来管理node环境,可以进行node版本的无缝切换。
2.3. Node启动问题
node启动后,显示glibc的版本过低,两种方式:
- 降低node版本,但是我们代码是18版本起的,所以不行。
- 升级glibc版本,涉及到一系列包的升级,相当的麻烦,也不行。
2.4. Docker Node启动
发现node是可以从docker中启动,隔离到运行环境。也是官方推荐的操作。
里面带了rm,临时容器,后续还有打包需求,我们不需要这个参数。同步需要访问代码通过docker挂载的方式进行访问打包。
bash
docker run -it -v /root/electron-card:/opt/electron-card --entrypoint sh node:20-alpine
3. 打包问题
3.1. koffi编译问题
bash
npm error code 1
npm error path /opt/electron-card/node_modules/koffi
npm error command failed
npm error command sh -c node src/cnoke/cnoke.js -p . -d src/koffi --prebuild
npm error Failed to load prebuilt binary, rebuilding from source
npm error Error: CMake does not seem to be available
npm error at check_cmake (/opt/electron-card/node_modules/koffi/src/cnoke/src/builder.js:377:27)
npm error at Builder.build (/opt/electron-card/node_modules/koffi/src/cnoke/src/builder.js:240:9)
npm error at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
npm error at async main (/opt/electron-card/node_modules/koffi/src/cnoke/cnoke.js:145:9)
npm error A complete log of this run can be found in: /root/.npm/_logs/2025-04-23T03_22_51_972Z-debug-0.lo
分析后,确认需要安装对应的依赖。
3.1.1. 安装编译依赖
csharp
# 更新仓库索引
apk update
# 安装基础编译工具
apk add build-base cmake make python3 nodejs npm
# 安装额外依赖(koffi需要)
apk add linux-headers git curl
3.1.2. 设置 Python 链接(Alpine 默认使用 python3)
bash
ln -sf /usr/bin/python3 /usr/bin/python
3.1.3. 清理并重新安装
bash
cd /opt/electron-card
rm -rf node_modules package-lock.json
npm cache clean --force
# 尝试重新安装(使用--build-from-source强制编译)
npm install --build-from-source
3.2. 内存耗尽
由于是docker安装,会出现内存不足的情况,需要手动指定内存,最好指定4G以上的内存。使用临时增加的内存的方式来进行项目打包。
arduino
NODE_OPTIONS=--max-old-space-size=4096 npm run build
3.3. 7z解压缩无法使用
bash
⨯ cannot execute cause=fork/exec /opt/electron-card/node_modules/7zip-bin/linux/arm64/7za: no such file or directory
command=/opt/electron-card/node_modules/7zip-bin/linux/arm64/7za x -bd /root/.cache/electron-builder/fpm/102756486.7z -o/root/.cache/electron-builder/fpm/102756486
workingDir=/root/.cache/electron-builder/fpm
提示找不到7zip-bin,本来准备直接通过apk来安装, apk add p7zip
,安装后依然报这个错误。
3.3.1. 手动安装7z
在官网找到arm64对应的包。

下载后,解压后得到的7zz命令,跟我们需要的7za不一样,搜索后发现是可以兼容的;这个时候我们就需要直接进行映射,打包时访问到我们下载这个7zz即可。
复制7zz到/usr/bin
目录下,改成7za,进行符号连接。后面的是在项目node_nodules目录中。
bash
# 进行符号连接
ln -sf /usr/bin/7za ./node_modules/7zip-bin/linux/arm64/7za
# 测试执行权限
./node_modules/7zip-bin/linux/arm64/7za -version
3.3.2. 手动安装fpm打包工具
参照7z的模式,同样进行符号连接替换。
- 安装fpm
csharp
# Alpine Linux
apk add ruby ruby-dev build-base
gem install fpm -v 1.9.3
- 设置变量,并关联
bash
# 设置环境变量
export USE_SYSTEM_FPM=true
# 进行符号连接
ln -sf /usr/bin/7za /root/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/fpm
可以看到自带的fpm是x86架构的,需要进行替换。
4. 打包
执行npm run build-l-32
。就可以打包出来我们需要deb包,下一步就是找一个arm64的机器,比如说华为麒麟9000的台式机验证一下。自此打包阶段性成功。