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

标签 javascript c++ node.js visual-studio node-gyp

我正在尝试转换一个在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设置以我不喜欢的方式固定到特定版本的Node。

这是我的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}和AFAIK之类的东西,也没有VS预定义变量可以处理此问题。

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

Visual Studio是否可以通过某种方式编写更新脚本,例如执行node --version命令,从输出中去除前导字母“v”,然后将结果放入环境变量中?

还有其他解决方案吗?

更新:

我通过从通用命令行应用程序开始更改了Visual Studio项目的设置,并且配置完全不同,根本没有CppProperties.json文件,但是问题仍然基本相同-现在我输入了$(LOCALAPPDATA)\node-gyp\Cache\12.16.1\include\node改为配置对话框。

最佳答案

使用node-addon-api的插件必须在编译时以节点的精确版本为目标。

这是因为N-API本身是“版本化的”(具有一个数字宏NAPI_VERSION,当前从1到5,加上特殊值NAPI_VERSION_EXPERIMENTAL=2147483647)

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

该插件是“复古链接”到node.exe(我不知道该技术的名称),而该链接是“延迟加载”链接。该技巧使插件可以使用主机可执行文件中的N-API函数,即使它不是“node.exe”(因此使用win_delay_load_hook.cc)也是如此。

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

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

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

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

亲爱的node / node_gyp / N-API专家,请仔细阅读本文,不要犹豫,指出/解决该答案中的错误。

关于javascript - Visual Studio C++项目中node-gyp包含文件的自动更新路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60478768/

相关文章:

javascript - DOJO Build 如何创建图层?

javascript - Onsen UI,如何使用 isShow() 方法

c++ - C++-从派生类中提取模板参数

c++ - fill_n() 不允许更改变量值

提交表单时,jquery 未正确更新 Handlebars 部分 View (express、node.js)

javascript - 为什么添加另一个事件监听器后 FirstPersonControls.js 会停止运行?

javascript - 如何使用 jQuery 将面板菜单固定到位

c++ - 堆栈内存错误创建核心文件?

javascript - 使用 mongoose 查询 mongodb 集合中的正则表达式

node.js - 如何查看nodejs中readline模块的源代码?