1

我编写了一个使用nodegit的 Electron 应用程序。对于我的测试部分,我将ava与 Spectron 结合使用来测试我的应用程序。我的所有测试都有效 - 包括在我的应用程序中使用nodegit的函数。

除了上面描述的测试之外,我还制作了一个纯非电子测试文件,我在其中直接导入了 nodegit。

 import * as nodegit from 'nodegit';

现在通过ava执行这个测试会返回:

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了预期的版本。为什么节点认为该版本在我的应用程序中实际运行时不匹配?这就是我的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 来自哪里,谁能解释我?

4

3 回答 3

1

嘿)我想我可以解决你的问题,试试这个:

"engines": {
  "node": ">=14.0.0"
},

到您的 package.json 并删除 node_modules 并在您的项目目录中执行 npm i 。它应该有帮助

于 2020-11-14T14:01:15.157 回答
1

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

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

根据nodegit的自述文件,

“NodeGit 可以在大多数开箱即用的系统上运行,无需任何原生依赖。”

但看起来您至少需要nodegit@0.27.x从使用 Node 14 中获取预构建的二进制文件。来源

因此,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

我不确切知道普通节点的等价物是什么,但让我知道这是否能让你更接近,如果是这样,我会看看我能找到什么。

于 2020-11-18T23:46:56.687 回答
1

答案已经解决,只需添加一种方法。

如前所述,无论每个 Node.js 的版本如何,您的 Node.Js 的 ABI(应用程序二进制接口)可能与 Electron 使用的 Node.js 的 ABI 不同。

因此,您使用 NPM 安装本机模块,该模块使用您拥有的具有相应 NODE_MODULE_VERSION (ABI) 的 Node.js 构建 OK,但是当 Electron 尝试使用它时,您会收到一个错误,要求您的模块使用 Node 的 ABI 版本。 js 包含在 Electron 中。

另一种方法:

像任何其他 Node 项目一样安装模块,然后使用electron-rebuild包为 Electron 重建。

npm install --save-dev electron-rebuild
./node_modules/.bin/electron-rebuild

笔记

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

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

于 2021-04-28T23:32:58.397 回答