我无法弄清楚我的生活如何得到这项工作。我正在使用的模块(grunt-sloc)的grunt配置需要Files Object Format。使用这个,我希望能够匹配顶级目录下的所有常规文件(即非目录)。
例如,假设这是我的目录结构,其中+
表示目录,-
表示常规文件:
repo
+ dir
- unwanted.js
- server.js
如何使用Grunt的Files Object Format匹配server.js
而不是dir
或dir/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
,这让我觉得它正在运行。
答案 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
配置如下:
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'
]);
};
通过CLI正常运行grunt
导致grunt-sloc仅报告两个文件的统计信息,即foo.js
和server.js
。
正如预期的那样,由于JSON是non-supported语言,因此省略了package.json
的统计信息。
我发现这个post的答案在解释如何从初始返回的数组中排除以!
开头的模式方面提供了相当丰富的信息。