Electron打包ARM环境deb包

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的台式机验证一下。自此打包阶段性成功。

相关推荐
Mikey_n几秒前
Spring Boot 注解详细解析:解锁高效开发的密钥
java·spring boot·后端
Kookoos33 分钟前
【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
后端·物联网·c#·.net
帮帮志37 分钟前
vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
spring boot·后端·交互
炒空心菜菜11 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
蜗牛沐雨13 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教13 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
秋野酱14 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
小明.杨14 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮14 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_124987075314 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计