我正在开发一个大型node.js项目,其中还包括几个本地库
要在JavaScript中使用这些库,我使用node-gyp将它们编译为节点插件(.node
)。
我想从根目录运行node-gyp一次,以递归方式编译所有可用的binding.gyp
(在所有子目录中)。
有没有办法做到这一点?
答案 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(' ');\")"
]
}
]
}