grunt(minimatch / glob)文件夹排除

时间:2012-09-28 00:34:41

标签: javascript regex node.js glob gruntjs

我有一种情况,我正在尝试使用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

希望容器重复,但这不起作用,它无法匹配所有内容。

是否可以将正则表达式传递给grunt文件路径,或者让它为我工作?

更新

以下是我目前正在处理此问题的方法:

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

如果可以在minimatch中删除文件夹,我仍然感兴趣。

1 个答案:

答案 0 :(得分:149)

在当前正在开发的版本0.4.0a中,grunt.file.expand方法现在支持排除,并且可以使用与基础迷你匹配库相比不那么复杂的方式。这是可能的,因为grunt.file.expand接受多个模式(而minimatch只接受一个)。

来自the grunt.file.expand documentation

  

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

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

如果你真的很好奇的话,看看grunt.file.match unit tests

请注意,提供此功能的grunt版本尚未正式发布,但如果您有兴趣在项目中使用它,请参阅When will I be able to use in-development feature 'X'?常见问题解答条目。