Visual Studio C++ 项目中 node-gyp 包含文件的自动更新路径

Auto-update path to node-gyp include files in a Visual Studio C++ project

我正在尝试转换一个在 MacOS 和 Linux(特别是 Raspbian)上编译得很好的项目,以便它可以在 Windows 上编译。 (完整代码在这里:https://github.com/kshetline/rpi-acu-rite-temperature

在悲痛之后(就像我安装的 Node 12 在我不知情的情况下消失并被 Node 8 取代,在 Windows C++ longint 上是都是 32 位?真的吗!?)我终于使用 node-gyp 和 Visual Studio 2019 编译了代码,但是 Visual Studio 设置固定为特定版本以我不喜欢的方式节点。

这是我的 CppProperties.json 文件:

{
  "configurations": [
    {
      "inheritEnvironments": [
        "msvc_x86"
      ],
      "name": "x86-Debug",
      "includePath": [
        "${env.INCLUDE}",
        "${env.LOCALAPPDATA}\node-gyp\Cache\12.16.1\include\node\**",
        "${workspaceRoot}\**"
      ],
      "defines": [
        "WIN32",
        "_DEBUG",
        "NAPI_CPP_EXCEPTIONS",
        "UNICODE",
        "_UNICODE",
        "USE_FAKE_PIGPIO"
      ],
      "intelliSenseMode": "windows-msvc-x86"
    }
  ]
}

我不想将特定版本的 Node 放在我的包含路径中,但我不知道没有它如何进行。我什至无法通过使用 12.*12.** 使其适用于特定的主要版本的 Node - 通配符似乎对我不起作用。

我看不到 Windows 环境变量可以让我使用 ${env.NODE_VERSION} 之类的东西,据我所知,也没有 VS 预定义变量可以处理这个问题。

我可以使用我自己的环境变量,但必须手动更新,这是我试图避免的。

Visual Studio 是否有一种方法可以编写更新脚本,比如以某种方式执行命令 node --version,从输出中剥离前导字母 'v',然后将结果进入环境变量?

还有其他可能的解决方案吗?

更新:

我更改了我的 Visual Studio 项目的设置,从一个通用的命令行应用程序开始,配置工作完全不同,根本没有 CppProperties.json 文件,但是问题基本上还是一样的——我现在 $(LOCALAPPDATA)\node-gyp\Cache.16.1\include\node 进入了一个配置对话框。

使用 node-addon-api 的插件必须在编译时针对 node 的精确版本。

那是因为N-API本身就是"versioned",(带个位数的宏,NAPI_VERSION,目前从1到5,加上特殊值NAPI_VERSION_EXPERIMENTAL=2147483647

如您所见,例如,在 N-API Version Matrix 中,版本 4 在节点 v10.16.0 中可用,但在某些较旧的 v10 版本中不可用。

插件是 "retro-linked"(我不知道那个技术的名称)到 node.exe,link 是 "delay load"。该技巧允许插件使用主机可执行文件中的 N-API 函数,即使它不是 "node.exe"(因此使用 win_delay_load_hook.cc)。

至于CppProperties.json文件,据我了解,它仅供Intellisence使用,与编译时使用的headers无关。

您可以强制node-gyp使用特定版本的节点,与机器上安装的当前版本无关,使用configure命令的--target选项。

另一个有用的选项是 --devdir,它允许摆脱臭名昭著的 (afaic) %localappdata%\node-gyp\Cache 根目录。

所有node-gyp命令选项都是here

拜托,亲爱的 node/node_gyp/N-API 阅读本文的专家,请不要犹豫 signal/fix 答案中的错误。