grunt(minimatch/glob)文件夹排除

Jes*_*sse 74 javascript regex glob node.js gruntjs

我有一种情况,我正在尝试使用grunt来提取代码库,排除特定文件夹.

grunt在引擎盖下使用minimatch(类似于bsdglob)来匹配文件,但我似乎无法弄清楚如何进行文件夹的.gitignore样式排除.

我想要摄取这个:

ignoreme

并匹配这些:

/folder/path/here/to/something/ok.js
/another/folder/path.js
/test.js
Run Code Online (Sandbox Code Playgroud)

但不符合这些:

/folder/ignoreme/something.js
/folder/path/here/to/ignoreme/metoo/file.js
Run Code Online (Sandbox Code Playgroud)

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

/**/*.js
Run Code Online (Sandbox Code Playgroud)

所以我想我可以这样做:

/**/!(ignoreme)/**/*.js
Run Code Online (Sandbox Code Playgroud)

但是匹配ignoreme文件夹中的文件.

我习惯了正则表达式,但似乎无法弄清楚如何重复模式或其他东西 - 我也试过像:

/(!(ignoreme)|*)*/*.js
Run Code Online (Sandbox Code Playgroud)

希望容器会重复,但这不起作用,它只是无法匹配所有东西.

有没有办法将正则表达式传递给grunt文件路径,或者让这个为我工作?

更新:

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

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

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

小智 149

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

grunt.file.expand文档:

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

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

如果你真的很好奇的话,看看grunt.file.match单元测试.

请注意,提供此功能的grunt版本尚未正式发布,但如果您对在项目中使用它感兴趣,请参阅我何时可以使用开发中功能'X'?FAQ条目.

  • 值得注意的是:排除模式只有在它们来之后才会起作用*之后*它们是排除的是否与包含模式相匹配.首先把我的排斥模式搞糊涂了. (14认同)
  • `grunt watch --verbose`查看正在观看的文件 (3认同)