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++ long
和 int
上是都是 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 答案中的错误。
我正在尝试转换一个在 MacOS 和 Linux(特别是 Raspbian)上编译得很好的项目,以便它可以在 Windows 上编译。 (完整代码在这里:https://github.com/kshetline/rpi-acu-rite-temperature)
在悲痛之后(就像我安装的 Node 12 在我不知情的情况下消失并被 Node 8 取代,在 Windows C++ long
和 int
上是都是 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 答案中的错误。