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

相关推荐
细心的莽夫5 分钟前
Elasticsearch复习笔记
java·大数据·spring boot·笔记·后端·elasticsearch·docker
程序员阿鹏15 分钟前
实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】
java·spring boot·后端·spring·docker·tomcat·intellij-idea
Asthenia041235 分钟前
HTTPS 握手过程与加密算法详解
后端
刘大猫261 小时前
Arthas sc(查看JVM已加载的类信息 )
人工智能·后端·算法
Asthenia04121 小时前
操作系统/进程线程/僵尸进程/IPC与PPC/进程大小/进程的内存组成/协程相关/Netty相关拷打
后端
Asthenia04122 小时前
深入解析 MySQL 执行更新语句、查询语句及 Redo Log 与 Binlog 一致性
后端
杨充2 小时前
10.接口而非实现编程
后端
等什么君!3 小时前
springmvc入门案例
后端·spring
苏三说技术3 小时前
基于SpringBoot的课程管理系统
java·spring boot·后端
桦说编程3 小时前
警惕AI幻觉!Deepseek对Java线程池中断机制的理解有误
java·后端·deepseek