使用 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 。应该有帮助

这可能是以下两种情况之一:

  1. 您正在加载的本机依赖项通过 prebuild 提供预构建的二进制文件 -- 可能是这种情况
  2. 您正在加载的本机依赖项是作为源代码下载的,构建二进制文件由您决定。

根据 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

备注

  1. 这将重建您已经构建的模块,但这次会自动查找您拥有的 Electron 版本的 headers。
  2. 每次 运行“npm install”(或在 package.json 的脚本部分添加序列)时都需要重复此操作。
  3. 使用“Electron Forge”,此工具会自动应用于开发或制作可分发文件。使用“Electron Packager”,您可以查看项目的自述文件。

来源: https://github.com/electron/electron-rebuild