Путь автообновления к включаемым файлам узла в проекте Visual Studio C ++ - PullRequest
1 голос
/ 01 марта 2020

Я пытаюсь преобразовать проект, который прекрасно компилируется на 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 задано определенное значение. c версия 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 1040 * в моем пути включения, но я не знаю, как заставить это работать без него. Я даже не могу заставить его работать для конкретной c основной версии Node с помощью 12.* или 12.** - здесь мне не подходят подстановочные знаки.

Не вижу Windows переменная окружения, которая позволила бы мне использовать что-то вроде, скажем, ${env.NODE_VERSION}, и в AFAIK нет предопределенной переменной VS, которая бы справилась бы и с этим.

Я мог бы использовать свою собственную переменную окружения, но это я должен обновляться вручную, чего я и стараюсь избегать.

Есть ли в Visual Studio способ, которым я мог бы написать сценарий обновления, например, выполнив команду node --version, удалив начальную букву ' v 'из вывода, а затем поместить результат в переменную окружения?

Любые другие возможные решения?

Обновление:

Я изменил настройка моего проекта Visual Studio, начиная с универсального c приложения командной строки, и конфигурация работает совершенно по-другому, без файла CppProperties.json вообще, но проблема остается в основном той же - у меня теперь есть $(LOCALAPPDATA)\node-gyp\Cache\12.16.1\include\node ent Вместо этого перейдите в диалог настроек.

1 Ответ

1 голос
/ 09 апреля 2020

Аддон, использующий node-addon-api, должен во время компиляции указывать точную версию узла.

Это потому, что N-API сам по себе "версионный" (с одним макросом di git, NAPI_VERSION, в настоящее время от 1 до 5, плюс специальное значение NAPI_VERSION_EXPERIMENTAL=2147483647)

Как видно, например, в Матрице версий N-API , версия 4 доступна в node v10.16.0, но НЕ в некоторых старых выпусках v10.

Аддон "ретро-связан" (я не знаю название этого метода) к node.exe, и эта ссылка является "задержкой" загрузить "один. Этот прием позволяет аддону использовать функции N-API, которые есть в исполняемом файле хоста, даже если это не "node.exe" (отсюда и использование win_delay_load_hook.cc).

Что касается файла CppProperties.json Насколько я понимаю, он используется только Intellisence и не имеет отношения к заголовкам, используемым во время компиляции.

Вы можете заставить узел-gyp использовать указанную c версию узла, не связанную с текущей версией. установлен на машине, с опцией --target для команды configure.

Еще одна полезная опция - --devdir, которая позволяет избавиться от печально известного (afai c) %localappdata%\node-gyp\Cache * Каталог 1036 *.

Все параметры команды node-gyp здесь

Пожалуйста, уважаемые эксперты node / node_gyp / N-API, читающие это, не стесняйтесь сигнализировать / исправлять ошибки в этом ответе.

...