grunt(minimatch / glob)文件夹排除


74

我遇到一种情况,我试图使用grunt来清理代码库,但不包括特定文件夹。

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

希望容器会重复,但是那行不通,只是无法匹配所有内容。

有什么方法可以通过正则表达式来查找文件路径,还是可以为我工作?

更新:

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

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

如果在minimatch中可能排除文件夹,我仍然会感兴趣。


2
使用map会导致files包含TRUEFALSE值的数组。filter将正确设置files为已过滤路径的列表。
deefour

对,您一定在晚上打字。更新了代码示例以使其正常工作。
杰西

Answers:


148

在当前开发的版本0.4.0a中,该grunt.file.expand方法现在支持排除,并且可以说比基本的minimatch匹配库复杂得多。这是可能的,因为grunt.file.expand可以接受多种模式(而minimatch仅接受一种)。

grunt.file.expand文档中

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

这意味着您可以指定['/**/*.js', '!**/ignoreme/**'],虽然第一个模式会将所有.js文件添加到结果集中,但是第二个模式随后将删除/ignoreme/结果集中的所有文件。

如果您真的很好奇,请看一下grunt.file.match单元测试

请注意,尚未正式发布具有此功能的grunt版本,但是如果您有兴趣在项目中使用它,请参阅何时可以使用开发中功能“ X”?常见问题解答条目。


非常感谢您的回复!对于我的问题,这看起来似乎是一种更为优雅的解决方案-我将等待稳定的版本,但是当它发布时我会进行切换!
杰西

14
值得注意的是:排除模式,只有当他们来的工作无论-IT-是-他们-排除已经被纳入一个模式匹配。首先把我的排除模式弄糊涂了。
贾斯汀·塞尔斯

3
grunt watch --verbose看看正在监视哪些文件
Shanimal

棒极了。以为我不得不写一些怪异的过滤器来忽略文件。
杰夫2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.