解释Globs#

通配符是一串用于匹配文件路径的文字和/或通配符字符。通配是使用一个或多个通配符在文件系统上定位文件的行为。

src()方法期望一个单个通配符字符串或一个通配符数组,以确定您的流水线将操作哪些文件。必须至少找到一个匹配项以避免src()出错。当使用通配符数组时,它们按数组顺序匹配 - 对于负通配符特别有用。

段和分隔符#

段是分隔符之间的所有内容。通配符中的分隔符始终是/字符 - 无论操作系统如何 - 即使在路径分隔符为\\的Windows系统中也是如此。在通配符中,\\被保留为转义字符。

在这里,*被转义,因此它被视为文字而不是通配符字符。

'glob_with_uncommon_\\*_character.js'

避免使用Node的path方法,如path.join,来创建全局通配符。在Windows上,它会生成无效的全局通配符,因为Node使用\\作为分隔符。同样,出于相同的原因,避免使用__dirname全局变量,__filename全局变量,或process.cwd()

const invalidGlob = path.join(__dirname, 'src/*.js');

特殊字符:*(单星号)#

匹配单个段内的任意数量(包括零)字符。用于在一个目录中进行文件全局匹配。

此全局通配符将匹配像index.js这样的文件,但不会匹配像scripts/index.jsscripts/nested/index.js这样的文件。

'*.js'

特殊字符:**(双星号)#

匹配跨段的任意数量(包括零)字符。用于在嵌套目录中进行文件全局匹配。确保适当限制双星号全局通配符,以避免不必要地匹配大型目录。

在这里,全局通配符适当限制在scripts/目录中。它将匹配像scripts/index.jsscripts/nested/index.jsscripts/nested/twice/index.js这样的文件。

'scripts/**/*.js'
在前面的示例中,如果未添加`scripts/`前缀,将匹配`node_modules`或其他目录中的所有依赖项。

特殊字符:!(否定)#

由于全局通配符按数组顺序匹配,否定通配符必须在数组中至少跟随一个非否定通配符。第一个找到一组匹配项,然后否定通配符会移除其中的一部分结果。当排除目录中的所有文件时,必须在目录名称后添加/**,这是全局通配符库在内部进行优化的。

['scripts/**/*.js', '!scripts/vendor/**']

如果在否定之后有任何非负的通配符,后续匹配集合中将不会删除任何内容。

['scripts/**/*.js', '!scripts/vendor/**', 'scripts/vendor/react.js']

负通配符可用作限制双星通配符的替代方法。

['**/*.js', '!node_modules/**']
在上面的示例中,如果负通配符是`!node_modules/**/*.js`,通配库将不会优化否定,并且每个匹配都必须与负通配符进行比较,这将非常缓慢。要忽略目录中的所有文件,只需在目录名称后添加`/**`通配符。

重叠的通配符#

两个或更多个(无意间)匹配同一文件的通配符被视为重叠。当在单个src()中使用重叠的通配符时,gulp会尽力删除重复项,但不会尝试在不同的src()调用之间去重。

高级资源#

大部分关于在gulp中使用通配符的内容都在这里涵盖了。如果您想深入了解,这里有一些资源。