我正在使用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
重建其本机依赖项
它甚至重建到我正在寻找的平台和拱门,达尔文和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
任何帮助,让这个工作将不胜感激,谢谢!
1条答案
按热度按时间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.现在,已针对正确的平台和架构编译了正确的绑定文件,在运行时它将找到并运行!