grunt (minimatch/glob) 文件夹排除

IT技术 javascript regex node.js glob gruntjs
2021-03-16 13:58:01

我有一种情况,我试图使用 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.4.0a 中,该grunt.file.expand方法现在支持排除,并且可以说比底层的 minimatch 匹配库更简单。这是可能的,因为grunt.file.expand接受多个模式(而 minimatch 只接受一个)。

grunt.file.expand 文档

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

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

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

请注意,提供此功能的 grunt 版本尚未正式发布,但如果您有兴趣在项目中使用它,请参阅何时才能使用开发中的功能“X”?常见问题入口。

值得注意的是:排除模式,只有当他们来的工作无论-IT-是-他们-排除已经被纳入一个模式匹配。把我的排除模式放在首位让我感到困惑。
2021-04-16 13:58:01
非常感谢您的回复!对于我的问题,这看起来是一个更优雅的解决方案 - 我将等待稳定版本,但当它发布时我会切换!
2021-04-23 13:58:01
grunt watch --verbose 查看正在监视哪些文件
2021-05-02 13:58:01
棒极了。以为我必须编写一些奇怪的过滤器才能忽略文件。
2021-05-03 13:58:01