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

问题描述 投票:0回答:2

我正在使用带有 Homebrew 的 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-builder
install-app-deps

重建它的本机依赖项

它甚至可以重建我正在寻找的平台和架构,darwin 和 x64。这是有希望的。

  • electron-builder  version=23.0.3
  • loaded parent configuration  preset=react-cra
  • rebuilding native dependencies  [email protected] platform=darwin arch=x64

但是,当使用

npm run dev
运行应用程序时,它会运行
concurrently " cross-env BROWSER=none npm start" "wait-on http://localhost:3000 && electron ."

它仍在尝试寻找它的arm64版本:

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

任何帮助实现此工作的帮助将不胜感激,谢谢!

node.js macos sqlite electron homebrew
2个回答
24
投票

经过4天的挖掘,我终于开始工作了!!!

对于任何可能偶然发现这一点的人:

sqlite3 不起作用的原因有三个:

  1. 当使用

    npm install sqlite3
    安装节点sqlite3时,它会获取所有依赖项并安装它。然后,它获取目标架构和平台的预编译二进制绑定文件。就我而言,我们需要 ARM64 的
    napi-v6-darwin-unknown-arm64
    和 Apple M1 的 darwin。目前还没有适用于此 Apple ARM64 的预编译二进制文件,即使有,下一段将详细说明为什么它仍然无法工作。

  2. 问题在于它使用二进制编译包

    node-pre-gyp
    来确定系统的平台和架构,而这个Github问题的救世主详细说明了
    node-pre-gyp
    如何无法正确处理ARM架构检测并基本上将所有内容混合在一起。因为它没有正确检测,即使我们在安装时使用
    --build-from-source
    构建自己的绑定,它仍然无法工作,因为它为错误的架构编译了错误的绑定文件。更糟糕的是,如果我们不使用
    --build-from-source
    ,它只是简单地获取英特尔预编译的绑定文件。
    napi-v6-darwin-unknown-x64

  3. 现在,由于某种原因,在运行时,它现在可以正确检测架构并尝试查找绑定文件的 ARM64 版本,但它找不到它,并且会抛出可怕的错误“找不到模块”

    napi-v6-darwin-unknown-arm64
    。显然它找不到它,即使找到了,它也会抛出错误的架构错误,因为我们板上有英特尔版本
    napi-v6-darwin-unknown-x64

因此,经过 4 天的研究,我终于得到了它的工作原理:

  1. 卸载sqlite3:
    npm uninstall sqlite3
  2. 安装一个新的 sqlite3,从源代码构建它,指定目标架构并使用 node-pre-gyp 的后备构建只是为了安全起见:
    npm install sqlite3 --build-from-source --target_arch=arm64 --fallback-to-build
  3. 现在,正确的绑定文件已针对正确的平台和架构进行编译,在运行时它将找到它并运行!

0
投票

接受的答案非常详细,但是在不卸载 sqllite3 的情况下对我有用的是运行。

run npm rebuild

希望这有帮助。

信用@ThusharaJ

© www.soinside.com 2019 - 2024. All rights reserved.