在下面的数组中,第一个 glob 是第二个 glob 的子集:
[
"HomePage/03-LocalDevelopmentBuild/public/**/*.@(js)",
"HomePage/03-LocalDevelopmentBuild/**/*.@(js)"
]
但是我们如何以编程方式检测它呢? AFAIK“minimatch”仅将文件路径或目录路径与 glob 进行比较,而不是 2 个 glob。
正如您所发现的,
minimatch
对于此任务来说不是一个好的选择。相反,我们必须自己创建算法。下面是一个可以实现这一目的的脚本:
function splitGlobs(glob) {
let glob_arr = glob.split("*");
let globPath = glob_arr[0];
let globJuice = "";
for (let i = 0; i < glob_arr.length; i++) {
if (i != 0) {
globJuice += "*" + glob_arr[i];
}
}
return { path: globPath, juice: globJuice };
}
const globs = [
"HomePage/03-LocalDevelopmentBuild/**/*.@(js)",
"HomePage/03-LocalDevelopmentBuild/public/**/*.@(js)",
];
let glob0 = splitGlobs(globs[0]);
let glob1 = splitGlobs(globs[1]);
if (glob0.juice != glob1.juice) {
console.log(
`${globs[0]} and ${globs[1]} are not subsets -- they do not target the same file type.`,
);
} else if (glob0.path.includes(glob1.path)) {
console.log(`${globs[0]} is a subset of ${globs[1]}.`);
} else if (glob1.path.includes(glob0.path)) {
console.log(`${globs[1]} is a subset of ${globs[0]}.`);
} else {
console.log(
`${globs[0]} and ${globs[1]} target the same file type, yet they are not subsets.`,
);
}
执行此命令会产生
HomePage/03-LocalDevelopmentBuild/public/**/*.@(js) is a subset of HomePage/03-LocalDevelopmentBuild/**/*.@(js).
正如预期的那样。如果您不想输出一些文本,而是想添加某些功能,那完全取决于您!
希望这有帮助!愿代码与您同在...