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

时间:2016-08-01 07:54:36

标签: node.js recursion compilation native node-gyp

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

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

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

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

{
    '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/目录中 要将每个插件放入相应的目录,请在插件postbuild内添加binding.gyp目标:

{
  "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": "."
        }
      ]
    }
  ]
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

到目前为止,其他答案似乎仍然有效(无需更新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(' ');\")"
        ]
    }
  ]
}

(来自https://stackoverflow.com/a/60947528/2016831