在之前 《Electron + React 全家桶 开发到打包踩坑记录》中记录了开发+打包过程中遇到的坑和填坑方法,最终完结撒花🎉
但是当打包后的程序在 Ubuntu 18.04 上运行时又出现了新的问题,看来花还是撒早了 5555...
经过一番研究,主要问题集中在 electron、serialport 和 ubuntu 18.04 版本不匹配
以下使用我自己的 ubuntu 18.04 开发机
项目依赖
ubuntu 18.04 LTS
electron v14.1.1
serialport v9.2.1
开始打包
运行打包命令
# 先打包 react
npm run build
# 再打包 electron-builder 打包 Linux deb 安装包
sudo electron-builder --linux deb --x64
终端中看到一条:
To ensure your native dependencies are always matched electron version, simply add script `"postinstall": "electron-builder install-app-deps" to your `package.json`
这句话的意思是 serialport 是一个 c++ 原生模块,需要为它单独安装所需要的依赖来匹配 electron 的版本,这里由于我的
electron-builder 是全局安装的,所以先不需要修改 package.json ,我们先手动运行一下这个命令
# 删除刚才打包路径
sudo rm -rf dist
# 安装原生模块依赖
sudo electron-builder install-app-deps
# 重新打包
sudo electron-builder --linux deb
大坑出现
打包完成后安装并运行程序,发现程序运行白屏,打开开发者工具发现报错如下
根据报错信息发现没有找到 GLIBC_2.28
我们查看一下本机的 GLIBC 版本
ldd --version
发现版本号是 2.27,ubuntu 18.04 版本默认支持到 2.27版本,所以需要升级一下 glibc
版本匹配
这里需要注意一个问题: glibc 升级有破坏 ubuntu 系统的风险,所以现在有2个解决方案:
使用 ubuntu 自带的软件更新升级到 20.04 版本
降级 electron 和 serialport 到合适的版本
首先由于项目的特殊性,我们的工程机系统最好不要升级,否则可能出现其他新的问题,所以我只能选择第二个解决方案,所以如何选择 electron,serialport 的版本和 ubuntu 18.04 匹配是关键,经过一顿寻找后发现了一位大兄弟的评论帮助很大 serialport 所需的 glibc 版本
由于 ubuntu 18.04 glibc 默认最高支持到 2.27,所以选择 serialport@9.0.7 版本,但是由于打包时需要对原生模块进行编译,serialport包含了一个 serialport/bindings 的依赖,编译时 electron-builder install-app-deps 需要下载对应 electron 版本的压缩文件
serialport/bindings@9.0.7 GitHub 下载地址
我们在这里面找 electron 对应的压缩包(作者提供了 electron 和 node 两个版本的,我们只需要找 electron 版本的)
后面 v47 指的是electron 的 ABI 版本号。 什么是 ABI?
有一个查看 electron 和 nodejs ABI 版本号的包: node-abi
这里新建一个项目,方便以后也用到
cd ~
mkdir abi-tool
npm init
# 一路回车就行
npm install node-abi
touch index.js
vim index.js
// index.js
const nodeAbi = require('node-abi');
// 通过上图 serialport/bindings@9.0.7 ,选择支持的最新的 electron,ABI 版本号为 85
// 我们这里获取一下 ABI 版本号为 85 的 electron 版本号
console.log(nodeAbi.getTarget('85', 'electron'));
// '11.0.0'
所以接下来我们安装 electron@11.0.0 和 serialport@9.0.7
# 安装 electron
npm install electron@11.0.0 --save-dev
# 安装 serialport
npm install serialport@9.0.7
# 更新一下 @serialport/bindings,上面命令不会将 bindings 降级,这里需要手动降一下
npm install @serialport/bindings@9.0.7
然后删除之前的打包文件,重新运行打包命令
sudo rm -rf build dist
npm run build
sudo electron-builder install-app-deps
sudo electron-builder --linux deb
完结撒花🎉(又撒一次...)
这个时候重新安装 .deb 发现运行正常!填坑完成!(暂时...)
本文主要记录了作为一个 Linux 萌新的交学费之路,各位大佬如果有更好的解决方案恳请赐教~