使用 ava 时 NODE_MODULE_VERSION 不正确
Incorrect NODE_MODULE_VERSION when using ava
我编写了一个 Electron 应用程序,它结合使用 nodegit. For my test part I use ava 和 Spectron 来测试我的应用程序。我所有的测试都有效——包括在我的应用程序中使用 nodegit 的函数。
除了上述测试,我还制作了一个纯 非 Electron 测试文件,我直接在其中导入了 nodegit。
import * as nodegit from 'nodegit';
现在通过 ava returns this:
执行此测试
node_modules\.pnpm\nodegit@0.27.0\node_modules\nodegit\build\Release\nodegit.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 82. This version of Node.js requires
NODE_MODULE_VERSION 83. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
at Module._extensions..node (internal/modules/cjs/loader.js:1122:18)
82版到底从哪里来的?我只安装了 nodejs 14.15.0
,它按预期使用版本 83
。为什么 node 认为该版本在我的应用程序中实际工作时不匹配?这就是我的 package.json
的样子:
"devDependencies": {
"ava": "^3.13.0",
},
"scripts": {
"ava": "node_modules/.bin/ava",
...
},
"ava": {
"files": [
"*.ts"
],
"extensions": [
"ts"
],
"require": [
"ts-node/register"
],
"nodeArguments": [
"--napi-modules",
"--experimental-modules"
]
},
我自己构建了 nodegit
,在 config.gypi
文件中它甚至引用了:
"node_module_version": 83,
我做了一个超级简单的可重现的例子:https://github.com/Githubber2021/node_module_version-issue
% node --version
14.15.0
% npm install
% npm run ava
... error
如果这是一个错误或版本 82 的来源,谁能解释一下?
嘿)我想我可以解决你的问题,试试这个:
"engines": {
"node": ">=14.0.0"
},
到您的 package.json 并删除 node_modules 并在您的项目目录中执行 npm i 。应该有帮助
这可能是以下两种情况之一:
- 您正在加载的本机依赖项通过 prebuild 提供预构建的二进制文件 -- 可能是这种情况
- 您正在加载的本机依赖项是作为源代码下载的,构建二进制文件由您决定。
根据 nodegit 的自述文件,
"NodeGit will work on most systems out-of-the-box without any native dependencies."
但看起来您至少需要 nodegit@0.27.x
才能使用 Node 14 获取预构建的二进制文件。Source
所以您看到的 82
来自 ABI 版本,预构建的二进制文件是针对该版本编译的。由于您已经在使用 nodegit@0.27.x
,那么不知何故您最终得到了错误 ABI 的预构建二进制文件。
这是我使用的一个 repo,它列出了不同版本的所有各种二进制文件,因此您可以看到这是如何发生的:https://github.com/lovell/sharp/tree/v0.25.3
我在 Electron 中开发,对于 Electron,我使用这样的命令来获取正确版本的 Electron 以 运行 npm rebuild
反对。
npm rebuild --runtime=electron --target=8.5.3 --disturl=https://atom.io/download/atom-shell
我不知道 确切地 普通节点的等价物是什么,但如果这让你更接近,请告诉我,如果是的话,我会看看我能找到什么。
答案已经解决了,只是增加一种方法。
如前所述,您的 Node.Js 的 ABI(应用程序二进制接口)可能与 Electron 使用的 Node.js 的 ABI 不同,无论每个 Node.js 的版本如何.
因此,您使用 NPM 安装本机模块,使用 Node.js 和相应的 NODE_MODULE_VERSION (ABI) 构建正常,但是当 Electron 尝试使用它时,您会收到一个错误询问您的模块使用 Electron 中包含的 Node.js 的 ABI 版本。
另一种方法:
像任何其他 Node 项目一样安装模块,然后使用 electron-rebuild 包为 Electron 重建。
npm install --save-dev electron-rebuild
./node_modules/.bin/electron-rebuild
备注
- 这将重建您已经构建的模块,但这次会自动查找您拥有的 Electron 版本的 headers。
- 每次 运行“npm install”(或在 package.json 的脚本部分添加序列)时都需要重复此操作。
- 使用“Electron Forge”,此工具会自动应用于开发或制作可分发文件。使用“Electron Packager”,您可以查看项目的自述文件。
我编写了一个 Electron 应用程序,它结合使用 nodegit. For my test part I use ava 和 Spectron 来测试我的应用程序。我所有的测试都有效——包括在我的应用程序中使用 nodegit 的函数。
除了上述测试,我还制作了一个纯 非 Electron 测试文件,我直接在其中导入了 nodegit。
import * as nodegit from 'nodegit';
现在通过 ava returns this:
执行此测试node_modules\.pnpm\nodegit@0.27.0\node_modules\nodegit\build\Release\nodegit.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 82. This version of Node.js requires
NODE_MODULE_VERSION 83. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
at Module._extensions..node (internal/modules/cjs/loader.js:1122:18)
82版到底从哪里来的?我只安装了 nodejs 14.15.0
,它按预期使用版本 83
。为什么 node 认为该版本在我的应用程序中实际工作时不匹配?这就是我的 package.json
的样子:
"devDependencies": {
"ava": "^3.13.0",
},
"scripts": {
"ava": "node_modules/.bin/ava",
...
},
"ava": {
"files": [
"*.ts"
],
"extensions": [
"ts"
],
"require": [
"ts-node/register"
],
"nodeArguments": [
"--napi-modules",
"--experimental-modules"
]
},
我自己构建了 nodegit
,在 config.gypi
文件中它甚至引用了:
"node_module_version": 83,
我做了一个超级简单的可重现的例子:https://github.com/Githubber2021/node_module_version-issue
% node --version
14.15.0
% npm install
% npm run ava
... error
如果这是一个错误或版本 82 的来源,谁能解释一下?
嘿)我想我可以解决你的问题,试试这个:
"engines": {
"node": ">=14.0.0"
},
到您的 package.json 并删除 node_modules 并在您的项目目录中执行 npm i 。应该有帮助
这可能是以下两种情况之一:
- 您正在加载的本机依赖项通过 prebuild 提供预构建的二进制文件 -- 可能是这种情况
- 您正在加载的本机依赖项是作为源代码下载的,构建二进制文件由您决定。
根据 nodegit 的自述文件,
"NodeGit will work on most systems out-of-the-box without any native dependencies."
但看起来您至少需要 nodegit@0.27.x
才能使用 Node 14 获取预构建的二进制文件。Source
所以您看到的 82
来自 ABI 版本,预构建的二进制文件是针对该版本编译的。由于您已经在使用 nodegit@0.27.x
,那么不知何故您最终得到了错误 ABI 的预构建二进制文件。
这是我使用的一个 repo,它列出了不同版本的所有各种二进制文件,因此您可以看到这是如何发生的:https://github.com/lovell/sharp/tree/v0.25.3
我在 Electron 中开发,对于 Electron,我使用这样的命令来获取正确版本的 Electron 以 运行 npm rebuild
反对。
npm rebuild --runtime=electron --target=8.5.3 --disturl=https://atom.io/download/atom-shell
我不知道 确切地 普通节点的等价物是什么,但如果这让你更接近,请告诉我,如果是的话,我会看看我能找到什么。
答案已经解决了,只是增加一种方法。
如前所述,您的 Node.Js 的 ABI(应用程序二进制接口)可能与 Electron 使用的 Node.js 的 ABI 不同,无论每个 Node.js 的版本如何.
因此,您使用 NPM 安装本机模块,使用 Node.js 和相应的 NODE_MODULE_VERSION (ABI) 构建正常,但是当 Electron 尝试使用它时,您会收到一个错误询问您的模块使用 Electron 中包含的 Node.js 的 ABI 版本。
另一种方法:
像任何其他 Node 项目一样安装模块,然后使用 electron-rebuild 包为 Electron 重建。
npm install --save-dev electron-rebuild
./node_modules/.bin/electron-rebuild
备注
- 这将重建您已经构建的模块,但这次会自动查找您拥有的 Electron 版本的 headers。
- 每次 运行“npm install”(或在 package.json 的脚本部分添加序列)时都需要重复此操作。
- 使用“Electron Forge”,此工具会自动应用于开发或制作可分发文件。使用“Electron Packager”,您可以查看项目的自述文件。