Glob 详解
Glob 是由字面字符和/或通配符组成的字符串,用于匹配文件路径。使用 Glob 是指使用一个或多个 glob 在文件系统上定位文件的行为。
src()
方法接受单个 glob 字符串或 glob 数组,用于确定你的管道将处理哪些文件。你的 glob 必须至少有一个匹配项,否则 src()
将报错。当使用 glob 数组时,任何负向 glob 都将从任何正向 glob 中移除匹配项。
片段和分隔符
片段是指分隔符之间的所有内容。glob 中的分隔符始终是 /
字符 - 与操作系统无关 - 即使在 Windows 中路径分隔符是 \\
。在 glob 中,\\
作为转义字符保留。
在这里,* 被转义了,因此它被视为字面字符而不是通配符。
'glob_with_uncommon_\\*_character.js'
避免使用 Node 的 path
方法(如 path.join
)来创建 glob。在 Windows 上,它会产生无效的 glob,因为 Node 使用 \\
作为分隔符。出于同样的原因,也要避免使用 __dirname
全局变量、__filename
全局变量或 process.cwd()
。
const invalidGlob = path.join(__dirname, 'src/*.js');
特殊字符: * (单星号)
匹配单个片段内的任意数量(包括零个)字符。用于在一个目录中匹配文件。
这个 glob 将匹配 index.js
等文件,但不匹配 scripts/index.js
或 scripts/nested/index.js
等文件。
'*.js'
特殊字符: ** (双星号)
匹配跨片段的任意数量(包括零个)字符。用于在嵌套目录中匹配文件。确保适当地限制你的双星号 glob,以避免不必要地匹配大型目录。
在这里,glob 被适当地限制在 scripts/
目录中。它将匹配 scripts/index.js
、scripts/nested/index.js
和 scripts/nested/twice/index.js
等文件。
'scripts/**/*.js'
scripts/
,也会匹配 node_modules
或其他目录中的所有依赖项。
特殊字符: ! (否定符)
前缀为 !
字符的 glob 将"否定"该 glob,完全排除匹配项。所有负向 glob 都将应用于每个正向 glob,这与 gulp v5 之前的版本不同。
在这里,将遍历 scripts/
目录中所有以 .js
结尾的文件,但会排除 scripts/vendor/
目录中的所有文件。
['scripts/**/*.js', '!scripts/vendor/**']
负向 glob 可以用作限制双星号 glob 的替代方法。
['**/*.js', '!node_modules/**']
有序 glob
gulp v5 之前的版本允许"有序 glob";然而,为了与生态系统中的大多数 glob 库保持一致,这一功能已被移除。
如果你需要"有序 glob"功能,可以使用 ordered-read-streams 库来组合流:
const order = require("ordered-read-streams");
exports.default = function () {
return order([
gulp.src("input/jquery/dist/jquery.js"),
gulp.src("input/detect_swipe/jquery.detect_swipe.js"),
]).pipe(gulp.dest('output/'));
}
重叠 glob
两个或多个(有意或无意)匹配同一文件的 glob 被视为重叠的。当在单个 src()
中使用重叠的 glob 时,gulp 会尽力移除重复项,但不会尝试在不同的 src()
调用之间去重。
高级资源
在 gulp 中使用 glob 所需的大部分内容已在此处介绍。如果你想更深入了解,以下是一些资源。