一、原始项目
1.原始程序适配arm,x86国产linux设备;新增需求适配loongArch64+麒麟v10sp1。
2.原始devDependencies
javascript
"devDependencies": {
"electron": "^17.2.0",
"electron-builder": "^23.0.3",
}
二、可能遇到的问题以及适配步骤
1.项目运行
问题:项目运行electron下载失败
解决方案:devDependencies中electron版本修改为龙芯开源社区支持的electron的相近版本,下载依赖时先注释掉electron,下载其他依赖,其他依赖正常下载按照提示解决错误即可或者尝试切换龙芯开源社区镜像源;然后龙芯开源社区下载对应electron解压到node_modules/electron ,然后再devDependencies解开注释;例如我的项目修改为17.4.0使用如下
2.打包问题electron下载失败
问题:打包失败提示electron下载问题
解决方案:常规问题适用于任何环境打包提示electron下载失败网络问题,手动下载拷贝到对应目录,龙芯开源社区下载electron对应版本.zip拷贝到~/.cache/electron目录;如下
3.打包问题electron-builder问题
问题:electron-builder源码不支持loong架构,electron-builder会有三个问题拆解到4和5
解决方案:electron-builder源码不支持loong架构,需要修改源码,可以去github找也可以自己改,需要改动地方不多,已我的版本为例,如下并没有loong64的
增加loong64 修改为如下图
node_modules下一共修改三个依赖app-builder-lib,builder-util,electron-builder;这三个依赖下有全局搜arm64类似这样的地方增加loong64即可(因为node中process.arch识别的是loong64)
4.打包问题fpm问题
问题:打包失败提示fpm问题
解决方案:两步走解决(常规问题国产机器打包均有这个问题,也适用于常规arm,x86打包提示fpm的解决方案 )
第一步:将下载失败的连接对应的fpm包手动下载,拷贝到指定目录~/.cache/electron-builder/fpm/并且解压 ,如下图:
第二步:手动下载fpm和ruby,下载命令如下
sudo apt update
sudo apt install ruby-full
sudo gem install fpm
失败的话去搜一下相关怎么下载,下载成功后,删除~/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/fpm和 ~/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/lib/ruby/bin.real/ruby ;然后ln -s创建软连接指向你下载的fpm和ruby如下图
将不会在提示fpm相关问题
5.安装/打包问题,架构不符
问题:成功打包为deb后安装提示机构不符如下
原因:nodejs的process.arch识别到的架构是loong64,实际uname -m 架构是loongarch64,如下图:
解决方案:需要将打好的包解压,命令如下:
ar -x xxx.deb
解压后control的压缩文件进行解压,命令如下:
tar -xf control.tar.xz
加压后会有control文件,cat查看Architecture:loong64如下:
修改为loongarch64,在打成deb包,可以通过ai生成脚本进行解压修改打包如下是我通过ai生成的脚本代码(没试过正确性,有问题通过ai可以微调)
bash
#!/bin/bash
# 参数检查
if [ $# -ne 2 ]; then
echo "用法: $0 <deb包路径> <新架构名称>"
exit 1
fi
input_deb="$1"
new_arch="$2"
# 提取目录和文件名
dir=$(dirname "$input_deb")
filename=$(basename "$input_deb" .deb)
output_deb="${dir}/${filename}_${new_arch}.deb"
# 创建临时目录
temp_dir=$(mktemp -d)
trap 'rm -rf "$temp_dir"' EXIT TERM INT
# 解压deb包
ar x "$input_deb" --output "$temp_dir" || { echo "解压deb包失败"; exit 1; }
# 进入临时目录处理文件
(
cd "$temp_dir" || exit 1
# 解压control.tar.xz
tar xf control.tar.xz || { echo "解压control.tar.xz失败"; exit 1; }
# 修改Architecture字段
sed -i "s/^Architecture: .*/Architecture: ${new_arch}/" control || { echo "修改control文件失败"; exit 1; }
# 重新打包control.tar.xz
tar cJf control.tar.xz control || { echo "重新打包control.tar.xz失败"; exit 1; }
# 重新打包deb文件
ar r "$output_deb" debian-binary control.tar.xz data.tar.* || { echo "重新打包deb失败"; exit 1; }
) || exit 1
echo "成功生成: $output_deb"