node-gyp:所有子目录中的 运行 binding.gyp

node-gyp: run binding.gyp in all subdirectories

我正在开发一个大型 node.js 项目,其中还包括几个本机库。
为了在 JavaScript 中使用这些库,我使用 node-gyp 将它们编译为节点插件 (.node)。

我想从根目录 运行 node-gyp 一次编译所有可用的 binding.gyp 递归(在所有子目录中)。

有什么办法吗?

我没有找到仅使用 node-gyp 执行此操作的任何选项,但一种可能的解决方案是在脚本中执行此操作。
例如,将以下内容添加到根文件夹中的 package.json

 "scripts": {
    "install": "find ./app/* -name binding.gyp -execdir node-gyp rebuild ;"
 }

这将导致在根文件夹中 运行 npm install 时编译所有本机插件。

GYP 允许为目标设置依赖项列表。您可以在顶级 bindings.gyp 中创建 type: none 的目标,并在其中列出子目录的依赖项:

{
    'targets': [
        {
            'target_name': 'build_all',
            'type': 'none',
            'dependencies': ['subdir1/bindings.gyp:*', 'subdir/subdir2/bindings.gyp:*'],
            # or generate dependencies list with a command expansion
            'dependencies': ['<!@(find -mindepth 2 -name binding.gyp | sed -e s/$/:*/)'],
        }
    ]
}

这将编译所有依赖项并将它们放入根目录中的 build/ 目录中。
要将每个插件放在相应的目录中,请在插件的 binding.gyp:

中添加一个 postbuild 目标
{
  "targets": [
    {
      "target_name": "my-target",
      "sources": [ "example.cpp" ]      
    },      
    {
      "target_name": "action_after_build",
      "type": "none",
      "dependencies": [ "my-target" ],
      "copies": [
        {
          "files": [ "<(PRODUCT_DIR)/my-target.node" ],
          "destination": "."
        }
      ]
    }
  ]
}

到目前为止似乎有效的其他答案的替代方案(无需更新 binding.gyp):

{
  "targets": [
    {
      "target_name": "addon",
      "sources": [ 
            "<!@(node -p \"var fs=require('fs'),path=require('path'),walk=function(r){let t,e=[],n=null;try{t=fs.readdirSync(r)}catch(r){n=r.toString()}if(n)return n;var a=0;return function n(){var i=t[a++];if(!i)return e;let u=path.resolve(r,i);i=r+'/'+i;let c=fs.statSync(u);if(c&&c.isDirectory()){let r=walk(i);return e=e.concat(r),n()}return e.push(i),n()}()};walk('./sources').join(' ');\")"
        ]
    }
  ]
}

(来自 )