electron在ubuntu arm64芯片上打包失败fpm架构不符

693 阅读3分钟

本身在mac m1芯片的开发机上开发,在当前mac上搭建了ubuntu arm64的虚拟机。在ubuntu虚拟机上搭建了一套开发环境,期望完成electron在linux arm芯片上的编译和打包。

背景

已经做了前期的一些工作,已验证代码本身没有问题,在ubuntu x86架构的物理机上编译、打包成功,运行也正常。 原期望在ubuntu x86物理机上打一个linux arm64的程序,打包没有报错,但是放在linux arm64的机器上安装也安装成功了,但是运行的时候就报错了。

不得已,期望在mac上搭建了ubuntu arm64的虚拟机,完成electron在linux arm芯片上的编译和打包。

错误日志

• building        target=deb arch=arm64 file=outtest/ee-linux-1.0.12-arm64.deb

  • downloading     url=https://registry.npmmirror.com/-/binary/electron-builder-binaries/fpm-1.9.3-2.3.1-linux-x86/fpm-1.9.3-2.3.1-linux-x86.7z size=4.6 MB parts=1

  • downloaded      url=https://registry.npmmirror.com/-/binary/electron-builder-binaries/fpm-1.9.3-2.3.1-linux-x86/fpm-1.9.3-2.3.1-linux-x86.7z duration=826ms

  ⨯ cannot execute  cause=exit status 1

                    errorOut=/home/cai/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/lib/ruby/bin/ruby: line 6: /home/cai/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/lib/ruby/bin.real/ruby: cannot execute binary file: Exec format error

    /home/cai/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/lib/ruby/bin/ruby: line 6: /home/cai/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/lib/ruby/bin.real/ruby: Success

    

                    command=/home/cai/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86/fpm -s dir --force -t deb -d libgtk-3-0 -d libnotify4 -d libnss3 -d libxss1 -d libxtst6 -d xdg-utils -d libatspi2.0-0 -d libuuid1 -d libsecret-1-0 --deb-recommends libappindicator3-1 --deb-compression xz --architecture arm64 --after-install /tmp/t-ECrR2y/1-after-install --after-remove /tmp/t-ECrR2y/0-after-remove --description '

出错原因分析

  • 命名是arm64架构,但是却去下载x86架构的包。
  • 在fpm命令执行时报错,架构不符。
  • fpm是最后一步骤,把某个程序打包成.deb的包。
  • 访问registry.npmmirror.com/-/binary/el… ,在返回的数据中没有 fpm linux arm64的记录。

image.png

解决方法

其实最严重的问题是fpm的问题,electron-builder 使用 fpm 进行打包,但是没有 arm64 架构的包,下载的是 x86 的包 ,x86在arm上没办法运行的。所以我们可以直接用sudo下载ruby,然后下载fpm,并在打包命令前指定使用本地的fpm.

  • 不再使用electron-builder中的fpm,而是使用系统中fpm
  • 首先卸载npm中fpm ,npm uninstall fpm
  • 安装系统的fpm
  • 更改package.json中打包命令,指定系统fpm
sudo apt-get install ruby-full
sudo gem install fpm

更改package.json文件打包命令
USE_SYSTEM_FPM=true electron-builder --arm64 --linux deb
  • 如此,就能mac arm架构的虚拟机ubuntu arm64上,打包出linux arm64的.deb包了。

查看linux出错日志

打包后运行可能会出现程序运行异常的情况。可以通过查看系统日志的方法确定错误原因。

系统日志

cd /var/log
cat syslog

image.png

  • 在日志中找到你的进程名等于打包的包名,多对应的就是该程序的系统日志了。

程序日志

  • 程序一般会自动安装在/opt下
cd /opt/ee/logs
tail -n 1000 -f logfile.log