0%

为 Electron 编译安装 Sqlite3

sqlite3 就不必多介绍了,讲一下今天踩的几个坑和解决方案

https://github.com/TryGhost/node-sqlite3

Electron 中使用 sqlite3

最小安装用例,package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "sqlite3",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"electron": "^18.1.0",
"electron-builder": "^23.0.3",
"sqlite3": "^5.0.4"
},
"scripts": {
"start": "electron .",
"postinstall": "electron-builder install-app-deps"
}
}

直接运行 npm i 或者 yarn 安装依赖

非常好用的自己命令行编译的方法

方法一:官方的安装方法

--target=18.1.018.1.0 改成自己的 Electron 版本号

1
npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=`brew --prefix` --runtime=electron --target=18.1.0 --dist-url=https://electronjs.org/headers

方法二,先下载,后编译

1
2
3
4
npm install node-gyp -g
npm install sqlite3 --ignore-scripts
cd node_modules/sqlite3
node-gyp rebuild --target=16.0.6 --arch=arm64 --dist-url=https://electronjs.org/headers --module_name=node_sqlite3 --module_path=../lib/binding/napi-v3-darwin-arm64

之所以加上 --ignore-scripts,是因为 sqlite3 模块在 package.json 文件中写了下载时自动执行编译的脚本,如下:

1
2
3
4
"scripts": {
"install": "node-pre-gyp install --fallback-to-build",
......
}

方法三,参数更全,自己配置 node-gyp 执行脚本路径等,具体参数需要看 node-gyp 的文档

1
"/opt/homebrew/Cellar/node/17.5.0/bin/node" "/Users/username/Documents/Temp/sqlite3/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/Users/username/Documents/Temp/sqlite3/node_modules/sqlite3/lib/binding/napi-v6-darwin-unknown-arm64/node_sqlite3.node" "--module_name=node_sqlite3" "--module_path=/Users/username/Documents/Temp/sqlite3/node_modules/sqlite3/lib/binding/napi-v6-darwin-unknown-arm64" "--napi_version=8" "--node_abi_napi=napi" "--napi_build_version=6" "--node_napi_label=napi-v6"

踩坑及解决方案

NodeJS 17 版本问题

头铁使用最新版本 NodeJS v17.x 时,sqlite3 安装失败,报错:

1
2
3
gyp: name 'openssl_fips' is not defined while evaluating condition 'openssl_fips != ""' in binding.gyp while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1

https://github.com/nodejs/node-gyp/issues/2534

官方说法是 Nodejs 17 版本对 openssl_fips 不太支持,或者说有复写操作。

https://github.com/nodejs/node-gyp/issues/2534#issuecomment-976089582

解决方法如下

https://github.com/nodejs/node-gyp/issues/2543#issuecomment-1072104626

  • node-gyp 在本地安装最新的:
1
npm install -d node-gyp@latest

binding.gyp 中,添加(在顶部):

1
2
3
4
5
6
7
{
"variables": {
"openssl_fips" : "0"
},

...
}

但是我认为最好的办法是降回正式 16.x 版本

Homebrew 问题

如果你用 Homebrew 安装了 Nodejs,那么编译的时候参数会有所变化,多出一些参数

1
"/opt/homebrew/Cellar/node/17.5.0/bin/node" "/opt/homebrew/bin/npm" "install" "sqlite3" "--build-from-source" "--sqlite_libname=sqlcipher" "--sqlite=/opt/homebrew" "--runtime=electron" "--target=18.1.0" "--dist-url=https://electronjs.org/headers"

会多出一个 "--sqlite=/opt/homebrew" 的参数,而你电脑上没装 sqlite3 就会产生报错导致编译失败。

解决方案,Homebrew 或者 brew 卸载 Nodejs,用官方的 Nodejs 安装包重新安装

其他

Mac 卸载 Nodejs

编译 Electron sqlite3

Mac 卸载 Python