Grunt文件对象格式:紧靠顶级目录下的所有常规文件文件

时间:2016-12-19 17:13:36

标签: javascript node.js gruntjs minimatch

我无法弄清楚我的生活如何得到这项工作。我正在使用的模块(grunt-sloc)的grunt配置需要Files Object Format。使用这个,我希望能够匹配顶级目录下的所有常规文件(即非目录)。

例如,假设这是我的目录结构,其中+表示目录,-表示常规文件:

repo
  + dir
    - unwanted.js
  - server.js

如何使用Grunt的Files Object Format匹配server.js而不是dirdir/unwanted.js

这就是它在Compact Fomat中的外观:

mine: {
  src: [
    '*'
  ]
}

或者,在bash中,你会得到这样的:

ls -p | grep -v /;

以下是我使用Files Object Format尝试的内容:

  • 这不起作用:

    mine: {
      files: {
        '.': ['*']
      }
    }
    
  • 这两个都没有:

    mine: {
      files: {
        './': ['*']
      }
    }
    
  • 甚至不是这样:

    mine: {
      files: {
        './': ['*/server.js']
      }
    }
    
  • 也不是这样:

    mine: {
      files: {
        './': ['server.js']
      }
    }
    
  • 这样可行,但它以递归方式运行,我不想要这样做:

    mine: {
      files: {
        './': ['**/server.js']
      }
    }
    

在做了大量的测试和代码阅读之后,我已经确认它实际上是minimatch包(Grunt的依赖性),它没有返回我正在寻找的匹配项。所以它不是我使用的咕噜模块;这是我的笨拙配置。

由于Grunt如此受欢迎,这似乎是一个非常常见的用例,我猜测有一种方法可以做到这一点。有谁知道那是什么?

更新

正如RobC指出的那样,我的上一个示例 NOT 工作。它在server.js目录中找到node_modules,这让我觉得它正在运行。

1 个答案:

答案 0 :(得分:2)

首先,使用Files Object Format方法列出的示例FWIW对我来说也不起作用,包括你的最后一个:

 // Although this worked for you, this failed for me...
 mine: {
     files: {
         './': ['**/server.js']
     }
 }

我能让它工作的唯一方法是匹配所有内容,然后使用Grunt globbing模式否定顶级目录。

虽然以下要点演示了对我有用的内容,但它确实需要知道/配置您要排除的顶级目录的名称:

目录结构

给定目录设置如下:

repo
│
├─── dir
│   │
│   └─── unwanted.js
│
├─── foo.js
│
├─── Gruntfile.js
│
├─── node_modules
│   │
│   └─── ...
│
├─── package.json
│
└─── server.js

Gruntfile.js

...和Gruntfile.js配置如下:

module.exports = function(grunt) {
    grunt.initConfig({
        sloc: {
            mine: {
                files: {
                    '.': [
                        '**', // Match everything and add to the results set.

                        // Explicitly state which directories under the top
                        // level directory to negate from the results set.
                        '!**/node_modules/**',
                        '!**/dir/**',

                        // Files can be negated from the results set too.
                        '!**/Gruntfile.js' // 
                    ]
                }
            }
        }

    });
    grunt.loadNpmTasks('grunt-sloc');
    grunt.registerTask('default', [
        'sloc:mine'
    ]);
};

Sloc结果

通过CLI正常运行grunt导致grunt-sloc仅报告两个文件的统计信息,即foo.jsserver.js

正如预期的那样,由于JSON是non-supported语言,因此省略了package.json的统计信息。

附加说明:

我发现这个post的答案在解释如何从初始返回的数组中排除以!开头的模式方面提供了相当丰富的信息。