17

我正在binding.gyp为我的新 node.js 模块编写文件。我的所有源文件都在src/子目录下。我想在构建模块时使用所有这些。我不想每次添加新的 cpp 文件时都修改 binding.gyp,而是想通过某种通配符机制列出所有 cpp 文件。node-gyp 支持吗?类似以下的东西(不起作用

{
  'targets' : [
      {
          'target_name' : 'mymod',
          'sources' : 'src/*.cpp'
      }
   ]
}

我查看了https://code.google.com/p/gyp/wiki/InputFormatReference,但没​​有发现任何有用的东西。

4

4 回答 4

29

弄清楚了

{
  'targets' : [
      {
          'target_name' : 'mymod',
          'sources' : [ '<!@(ls -1 src/*.cpp)' ],
      }
   ]
}

看看这个链接

更新

上面的解决方案不能跨平台移植。这是一个便携式版本:

{
  'targets' : [
      {
          'target_name' : 'mymod',
          'sources' : [  "<!@(node -p \"require('fs').readdirSync('./src').map(f=>'src/'+f).join(' ')\")" ],
      }
   ]
}

本质上,它ls通过使用节点fs模块列出目录内容的 Javascript 代码替换了特定于平台的目录列表命令 ( )。

于 2013-03-14T20:07:30.017 回答
0

一个更便携的版本(不依赖于节点,而是依赖于 python):

"<!@(python -c \"import os; print '\n'.join(['%s' % x for x in os.listdir('.') if x[-3:] == '.cc' and 'test' not in x])\")"
于 2017-09-29T18:58:09.180 回答
0

为了过滤特定的文件扩展名cpp并支持预编译libraries .a文件,我稍微修改了接受的解决方案:

'sources': [
        'jamspell.cpp',
        "<!@(node -p \"require('fs').readdirSync('./src').filter(f=>f.endsWith('.cpp')).map(f=>'src/'+f).join(' ')\")",
        "<!@(node -p \"require('fs').readdirSync('./src/jamspell').filter(f=>f.endsWith('.cpp')).map(f=>'src/jamspell/'+f).join(' ')\")"
        ],
        'include_dirs': [
            "<!@(node -p \"require('node-addon-api').include\")"
        ],
        'libraries': [
          "<!@(node -p \"require('fs').readdirSync('./lib/contrib').filter(f=>f.endsWith('.a')).map(f=>'lib/contrib/'+f).join(' ')\")"
        ],
        'dependencies': [
            "<!(node -p \"require('node-addon-api').gyp\")"
        ],
于 2019-11-27T09:34:06.263 回答
0

如果有人想在某个文件夹中包含所有子文件和文件夹(在行尾定义,此处为“源”):

{
  "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 fs.readdir 递归目录搜索

于 2020-03-31T09:39:28.590 回答