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(' ');\")"
]
}
]
}
(来自 )
我正在开发一个大型 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(' ');\")"
]
}
]
}
(来自 )