寻求从文件列表生成最优匹配Glob的现成工具或高效方法
生成匹配文件列表的Glob表达式方案
现成npm模块推荐
- glob-generator:专为从文件列表生成最优Glob表达式设计,直接适配你的需求场景。
- path-to-glob-pattern:可将路径转换为Glob格式,结合公共路径处理逻辑,能快速生成匹配多文件的表达式。
- glob-parent + minimatch:组合使用可实现基础匹配逻辑,先提取公共路径,再将差异部分替换为
*。
具体使用示例
用glob-generator实现(最省心方案)
先安装包:
npm install glob-generator
调用示例:
const globGenerator = require('glob-generator'); const targetFiles = ["./packages/my-server", "./packages/my-client"]; const matchingGlob = globGenerator(targetFiles, { optimize: true }); console.log(matchingGlob); // 输出 "./packages/my-*" 或 "./packages/*"(根据内部优化策略自动选择更精准的表达式)
轻量手动实现(基于公共路径)
如果不想引入额外依赖,可基于common-path-prefix简化处理:
const commonPathPrefix = require('common-path-prefix'); function getBestMatchingGlob(fileList) { const basePrefix = commonPathPrefix(fileList); const relativePaths = fileList.map(file => file.slice(basePrefix.length)); // 拆分路径片段,找到首个差异位置替换为* const pathSegments = relativePaths.map(path => path.split('/')); const globSegments = []; for (let i = 0; i < pathSegments[0].length; i++) { const currentSegments = pathSegments.map(seg => seg[i]); if (new Set(currentSegments).size === 1) { globSegments.push(currentSegments[0]); } else { globSegments.push('*'); break; // 遇到差异后后续片段统一用*匹配 } } return `${basePrefix}${globSegments.join('/')}`; } console.log(getBestMatchingGlob(["./packages/my-server", "./packages/my-client"])); // 输出 "./packages/my-*"
内容的提问来源于stack exchange,提问作者manuth
相关产品推荐
相关产品推荐

