是否存在用于在node-gyp中列出源的通配符机制

时间:2013-03-13 22:17:33

标签: node-gyp

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

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

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

4 个答案:

答案 0 :(得分:22)

想出来

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

查看this link

<强>更新

上述解决方案无法跨平台移植。这是一个便携版本:

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

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

答案 1 :(得分:0)

要过滤诸如 private void showLookupDetailsDialog(String[] headings, String key, String value) { final TextView tv = new TextView(this); String[] valueArray = {}; valueArray = value.split(";"); String displayString = ""; if (valueArray.length > 1) { for (int i = 0; i < valueArray.length - 1; i++) { displayString = displayString + valueArray[i] + "\n"; } } else { displayString = valueArray[0]; } tv.setText(displayString); tv.setGravity(Gravity.CENTER); tv.setTextSize(40); tv.setMaxLines(5); tv.setScroller(new Scroller(this)); tv.setVerticalScrollBarEnabled(true); tv.setMovementMethod(new ScrollingMovementMethod()); tv.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET); new AlertDialog.Builder(this) .setTitle(headings[0] + ": " + key) .setMessage(headings[1] + ": ") .setView(tv) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }) .show(); } 之类的特定文件扩展名并支持预编译的cpp libraries文件,我对接受的解决方案作了些许修改:

.a

答案 2 :(得分: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 recursive directory search

答案 3 :(得分:-1)

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

"<!@(python -c \"import os; print '\n'.join(['%s' % x for x in os.listdir('.') if x[-3:] == '.cc' and 'test' not in x])\")"