跳到主要内容

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.jsscripts/nested/index.js 等文件。

'*.js'

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

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

在这里,glob 被适当地限制在 scripts/ 目录中。它将匹配 scripts/index.jsscripts/nested/index.jsscripts/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 所需的大部分内容已在此处介绍。如果你想更深入了解,以下是一些资源。