grunt(minimatch/glob)文件夹排除

76
我有这样一个情况,我正在尝试使用grunt来对代码库进行lint,但要排除特定的文件夹。
grunt在底层使用minimatch(类似于bsdglob)来匹配文件,但我似乎无法弄清如何使用.gitignore样式来排除文件夹。
我想要使用以下内容: ignoreme 并匹配以下内容:
/folder/path/here/to/something/ok.js
/another/folder/path.js
/test.js

但不匹配这些:

/folder/ignoreme/something.js
/folder/path/here/to/ignoreme/metoo/file.js

这将匹配所有内容,包括 ignoreme:

/**/*.js

所以我想我可以做这样的事情:

/**/!(ignoreme)/**/*.js

但是这个匹配也会匹配 ignoreme 文件夹中的文件。

我很熟悉正则表达式,但似乎无法想出如何在这里重复一个模式或其他操作 - 我还尝试过像这样的东西:

/(!(ignoreme)|*)*/*.js

希望容器能够重复,但不起作用,它只是无法匹配任何内容。

有没有办法将正则表达式传递到Grunt文件路径中,或者让这对我起作用?

更新:

这是我目前处理此问题的方式:

var pattern = /\/ignoreme\//
var files = grunt.file.expandFiles(arrayOfFilesPassedToMinimatch).filter(function(f){
  return !pattern.test(f)
})

如果 minimatch 支持文件夹排除,我仍然很感兴趣。


2
使用 map 会导致 files 包含一个由 TRUEFALSE 值组成的数组。filter 将正确地将 files 设置为经过筛选的路径列表。 - deefour
没错,我一定是晚上打的字。已经更新了代码示例以使其正常工作。 - Jesse
1个回答

149
在目前正在开发的版本0.4.0a中,grunt.file.expand方法现在支持排除功能,并且以比基础的minimatch匹配库更简单的方式实现。这是因为grunt.file.expand接受多个模式(而minimatch只接受一个)。
来自grunt.file.expand文档

该方法接受逗号分隔的通配符模式或通配符模式数组。与!开头的模式匹配的路径将从返回的数组中排除。模式按顺序处理,因此包含和排除的顺序很重要。

这意味着您可以指定['/**/*.js', '!**/ignoreme/**'],第一个模式将添加所有.js文件到结果集中,然后第二个模式将从结果集中删除所有/ignoreme/文件。
请看grunt.file.match单元测试,如果你真的很好奇。
请注意,提供此功能的grunt版本尚未正式发布,但如果您有兴趣在项目中使用它,请参阅何时能使用正在开发的X功能? FAQ条目。

非常感谢您的回复!这似乎是一个更优雅的解决方案来解决我的问题 - 我会等待稳定版本发布,但一旦发布我就会切换! - Jesse
14
值得注意的是:排除模式只有在包含模式匹配到需要排除的内容之后才能生效。如果将排除模式放在前面可能会引起混淆。 - Justin Searls
3
运行 grunt watch --verbose 命令以查看正在被监视的文件。 - Shanimal
太棒了。我还以为我得写一个奇怪的过滤器才能忽略一个文件。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接