Проблема курицы и яйца с помощью node-gyp: указание на файл заголовка в зависимости - PullRequest
0 голосов
/ 09 февраля 2020

Это моя первая попытка создать пакет npm, включающий код C ++. Я думал, что у меня все настроено правильно, потому что, работая в папке проекта для самого пакета, npm i или node-gyp rebuild работали просто отлично.

Но теперь, когда я опубликовал пакет, и я пытаюсь использовать этот пакет в качестве зависимости в другом проекте, во время компиляции происходит сбой установки при попытке включить важный заголовочный файл C:

  CXX(target) Release/obj.target/ar_signal_monitor/ar-signal-monitor-node.o
../ar-signal-monitor-node.cpp:1:10: fatal error: 'napi.h' file not found
#include <napi.h>
         ^~~~~~~~
1 error generated.

Заголовочный файл находится внутри одного из зависимости пакета, node-addon-api. Мой binding.gyp файл выглядит так:

{
  "targets": [
    {
      "target_name": "ar_signal_monitor",
      "cflags!": ["-fno-exceptions"],
      "cflags_cc!": ["-fno-exceptions"],
      "cflags": ["-Wall", "-std=c++11", "-pthread"],
      "cflags_cc": ["-Wall", "-pthread"],
      "sources": [
        "ar-signal-monitor-node.cpp",
        "ar-signal-monitor-node.h",
        "ar-signal-monitor.cpp",
        "ar-signal-monitor.h"
      ],
      "include_dirs": [
        "<!(node -e \"require('node-addon-api').include\")",
        "node_modules/node-addon-api",
        "/usr/include/node",
        "/usr/local/include/node"
      ],
      "libraries": [
        "-lwiringPi"
      ],
      "defines": ["NAPI_CPP_EXCEPTIONS"],
      'conditions': [
        ["OS==\"mac\"", {
          "defines": ["USE_FAKE_WIRING_PI"],
          "libraries!": ["-lwiringPi"],
          "xcode_settings": {"GCC_ENABLE_CPP_EXCEPTIONS": "YES"}
        }],
        ["OS==\"win\"", {
          "defines": ["USE_FAKE_WIRING_PI"],
          "libraries!": ["-lwiringPi"]
        }],
      ],
    }
  ]
}

Я пытаюсь использовать "include_dirs", чтобы сообщить компилятору, где найти заголовочный файл <napi.h>. Я думаю, что, возможно, проблема у меня заключается в том, что процесс установки хочет скомпилировать мой код C ++ сначала , и только после того, как это будет успешно сделано, затем загрузить зависимые npm пакеты, где файл заголовка мне нужен для успешной компиляции жизни.

Есть ли способ обойти эту проблему? Это другая проблема, чем я думаю? Сначала я попытался включить node-addon-api в клиентский проект, но это не помогло. (И даже если бы это сработало, это было бы не лучше, чем временное слово.)

Полный код проекта можно найти здесь: https://github.com/kshetline/rpi-acu-rite-temperature

1 Ответ

0 голосов
/ 09 февраля 2020

Я думал, что мне нужно сделать что-то другое в моем файле binding.gyp, но решение (или, по крайней мере, решение ) оказалось тем, что я мог сделать в мой package.json:

  "scripts": {
    "preinstall": "npm i node-addon-api",
...