grunt (minimatch/glob) 文件夹排除

Posted

技术标签:

【中文标题】grunt (minimatch/glob) 文件夹排除【英文标题】:grunt (minimatch/glob) folder exclusion 【发布时间】:2012-09-19 20:49:16 【问题描述】:

我有一种情况,我正在尝试使用 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 中可以排除文件夹,我仍然会感兴趣。

【问题讨论】:

使用map 会导致files 包含TRUEFALSE 值的数组。 filter 将正确地将 files 设置为过滤路径列表。 没错,一定是晚上打字的。更新了代码示例以正常工作。 【参考方案1】:

在当前正在开发的 0.4.0a 版本中,grunt.file.expand 方法现在支持排除,并且可以说比底层 minimatch 匹配库更简单。这是可能的,因为 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'? FAQ 条目。

【讨论】:

非常感谢您的回复!这看起来像是解决我的问题的一个更优雅的解决方案 - 我会等待稳定版本,但当它发布时我会切换! 值得注意的是:排除模式仅在它们之后出现时才有效把我的排除模式放在首位感到困惑。 grunt watch --verbose 查看正在观看哪些文件 太棒了。以为我必须编写一些奇怪的过滤器才能忽略文件。

以上是关于grunt (minimatch/glob) 文件夹排除的主要内容,如果未能解决你的问题,请参考以下文章

如何使用grunt压缩js文件

Grunt:查看多个文件,仅编译更改 - livereload 中断?

grunt-js文件压缩

如何用grunt压缩文件

Grunt:将文件名插入文件中

自动化构建 -- Grunt