electron 如何让node-sqlite3在Mac M1上工作?

7lrncoxx  于 2022-12-08  发布在  Electron
关注(0)|答案(1)|浏览(674)

我正在使用Rosetta 2与自制软件,并安装了sqlite3。
我将这些添加到我的~/.zshrc中,以便节点编译器可以找到brew安装:

export PATH="/usr/local/opt/sqlite/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/sqlite/lib"
export CPPFLAGS="-I/usr/local/opt/sqlite/include"

我正在使用npm install sqlite3进行安装,使用--build-from-source标记从源代码构建,还使用--sqlite=/usr/local/opt/sqlite/指定sqlite的自制版本
node-gyp转到其回退内部版本node-pre-gyp install --fallback-to-build
安装后,我将使用electron-builderinstall-app-deps重建其本机依赖项
它甚至重建到我正在寻找的平台和拱门,达尔文和x64。这是有希望的。

• electron-builder  version=23.0.3
  • loaded parent configuration  preset=react-cra
  • rebuilding native dependencies  dependencies=sqlite3@5.0.8 platform=darwin arch=x64

但是,当使用运行concurrently " cross-env BROWSER=none npm start" "wait-on http://localhost:3000 && electron ."npm run dev运行应用程序时
它仍然在努力寻找它的arm 64版本:
Error: Cannot find module '[..]/node_modules/sqlite3/lib/binding/napi-v6-darwin-unknown-arm64/node_sqlite3.node'
尽管我可以确认,它确实构建了x64版本,因为我在以下位置有一个:/napi-v6-darwin-unknown-x64/node_sqlite3.node
任何帮助,让这个工作将不胜感激,谢谢!

ux6nzvsh

ux6nzvsh1#

经过4天的挖掘,我终于让它工作了!!!
对于任何人可能会绊倒在这一点:
sqlite3不起作用的原因有三:
1.当使用npm install sqlite3安装节点sqlite3时,它获取所有依赖项并安装它。然后获取目标架构和平台的预编译二进制绑定文件。在我的例子中,我们希望napi-v6-darwin-unknown-arm64用于ARM 64,达尔文用于Apple M1。目前还没有可用于此Apple ARM 64的预编译二进制文件,即使有,下一段将详细说明为什么它仍然不起作用。
1.问题在于,它使用二进制编译包node-pre-gyp来确定系统的平台和架构,而这正是Github issue的救星,它详细说明了node-pre-gyp如何无法正确处理ARM架构检测,基本上将所有内容都搞混了。因为它无法正确检测,即使我们在安装时构建自己的--build-from-source绑定,它仍然无法工作,因为它为错误的架构编译了错误的绑定文件。更糟糕的是,如果我们不使用--build-from-source,它只是简单地获取Intel预编译的绑定文件。napi-v6-darwin-unknown-x64
1.由于某种原因,在运行时,它现在可以正确检测架构,并尝试查找绑定文件的ARM 64版本,但它找不到,并将抛出napi-v6-darwin-unknown-arm64的"module not found“错误。显然,它找不到,即使找到了,也将抛出错误的架构错误,因为我们在napi-v6-darwin-unknown-x64板上安装了英特尔版本。
经过4天的努力,我终于找到了工作:
1.卸载sqlite3:npm uninstall sqlite3
1.安装一个全新的sqlite3,从源代码构建它,指定目标arch,并使用带有node-pre-gyp的回退构建,以确保安全:npm install sqlite3 --build-from-source --target_arch=arm64 --fallback-to-build
1.现在,已针对正确的平台和架构编译了正确的绑定文件,在运行时它将找到并运行!

相关问题