【问题标题】:How to get node-sqlite3 working on Mac M1?如何让 node-sqlite3 在 Mac M1 上工作?
【发布时间】:2022-07-22 10:09:47
【问题描述】:

我正在使用带有 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-builderinstall-app-deps 重建它的本机依赖项

它甚至可以重建为我正在寻找的平台和架构,darwin 和 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 运行应用程序时

它仍在尝试找到它的 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


    【解决方案1】:

    挖了4天,终于搞定了!!!

    对于任何可能偶然发现此问题的人:

    sqlite3 不能正常工作的原因有三个:

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

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

    3. 现在由于某种原因,在运行时,它现在可以正确检测架构并尝试查找绑定文件的 ARM64 版本,但找不到它并会为 @987654329 抛出可怕的错误“找不到模块” @。它显然不会找到它,即使它找到了,它也会抛出错误的架构错误,因为我们有英特尔版本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. 现在为正确的平台和架构编译了正确的绑定文件,在运行时它会找到它并运行!

    【讨论】:

      【解决方案2】:

      在我运行“npm install sqlite3 --build-from-source --target_arch=arm64 --fallback-to-build”后,我仍然得到图像中显示的错误。 error messages

      【讨论】:

        猜你喜欢
        • 2022-08-13
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        相关资源
        最近更新 更多