一、原始項目
1.原始程序適配arm,x86國產linux設備;新增需求適配loongArch64+麒麟v10sp1。
2.原始devDependencies
"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可以微調)
#!/bin/bash# 參數檢查
if [ $# -ne 2 ]; thenecho "用法: $0 <deb包路徑> <新架構名稱>"exit 1
fiinput_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.xztar 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.xztar 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 1echo "成功生成: $output_deb"