ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

code2prompt 中的 Glob 模式:从通配符语法到文件过滤源码实现

code2prompt 中的 Glob 模式:从通配符语法到文件过滤源码实现 code2prompt 中的 Glob 模式从通配符语法到文件过滤源码实现【免费下载链接】code2promptA CLI tool to convert your codebase into a single LLM prompt with source tree, prompt templating, and token counting.项目地址: https://gitcode.com/GitHub_Trending/co/code2promptGlob 模式是一种借助通配符字符匹配文件名与路径的简单而强大的表达方式广泛用于命令行接口、脚本和编程语言中批量指定文件集合。本文以 code2prompt 项目文档 glob_patterns.md 为核心骨架系统讲解*、?、[]、**、{}等基础与高级通配符的语义并深入 code2prompt 的源码filter.rs、args.rs、configuration.rs说明这些模式在--include/--exclude过滤管线中的真实落地方式帮助读者既掌握通用 glob 语法也能精确控制「代码库 → LLM Prompt」的文件范围。一、Glob 模式是什么Glob 模式glob patterns是一套用于按名称批量匹配文件的通配符规则常见于ls、cp、mv、rm等命令行工具以及 Python 的glob库、JavaScript、Ruby 等编程语言的路径匹配设施中。与正则表达式不同glob 语法更直观、更贴近日常的文件名直觉因此在「指定一组文件/目录」的场景下几乎是标准答案。在 code2prompt 中glob 模式承担了最关键的一步决定仓库里的哪些文件应该被收录进最终生成的 LLM Prompt哪些应该被丢弃。项目文档将其定位为「使用通配符匹配文件名和路径」下面按基础与高级两档展开。二、基础通配符*— 匹配任意数量字符含零个*匹配任意数量的字符包括零个字符。示例*.txt匹配所有以.txt结尾的文件。?— 精确匹配一个字符?匹配恰好一个字符。示例file?.txt可以匹配file1.txt、fileA.txt但不会匹配file10.txt因为.txt前多了两个字符。[]— 匹配括号内任一字符[]匹配被包含字符中的任意一个支持区间写法。示例file[1-3].txt匹配file1.txt、file2.txt、file3.txt。[!]或[^]— 匹配括号外的任意字符[!]或[^]匹配未被包含在括号内的任意字符即否定语义。示例file[!1-3].txt匹配file4.txt、fileA.txt但不匹配file1.txt。三、高级模式**— 递归匹配任意层目录**匹配任意数量的目录与子目录递归。示例**/*.txt匹配当前目录及所有子目录下的全部.txt文件。{}— 花括号展开匹配任一逗号分隔模式{}匹配被包围的、以逗号分隔的多个模式中的任意一个本质上是「一写多」的语法糖。示例file{1,2,3}.txt等价于同时写出file1.txt、file2.txt、file3.txt三个模式。四、典型示例速查以下示例完整覆盖了文档中的五种经典用法可直接复制到 code2prompt 的过滤参数中使用匹配目录中的全部文本文件*.txt匹配扩展名前恰好只有一个数字字符的文件file?.txt匹配.jpg或.png扩展名的文件*.{jpg,png}匹配任意子目录下的全部.txt文件**/*.txt匹配以a或b开头、以.txt结尾的文件{a,b}*.txt五、glob 模式在 code2prompt 中的实际应用5.1 命令行入口--include/--exclude在 CLI 层code2prompt 通过 args.rs 暴露两个可重复出现的 glob 列表参数-i, --include PATTERNS需要收录文件的模式列表白名单-e, --exclude PATTERNS需要剔除文件的模式列表黑名单。配合使用示例与项目文档 filter_files.md 中的用法一致# 仅收录 Rust 与 TOML 文件 code2prompt path/to/codebase --include*.rs,*.toml # 排除所有 txt 与 md 文件 code2prompt path/to/codebase --exclude*.txt,*.md # 排除二进制/音频等大文件避免污染 prompt code2prompt path/to/codebase --exclude*.npy,*.wav值得注意的是CLI 参数与底层实现之间是「字符串模式 → GlobSet 编译 → 逐文件匹配」的流水线配置层面则由 configuration.rs 中的include_patterns/exclude_patterns字段承载同时支持通过 TOML 配置文件TomlConfig以声明式方式固化过滤规则。5.2 配置层面Code2PromptConfig作为无状态配置对象Code2PromptConfig中的include_patterns与exclude_patterns是两条独立的VecString列表二者可以同时为空、只填一个或同时填满语义组合规则见下文第六节。六、include / exclude 组合语义白名单叠加黑名单当--include与--exclude同时出现时code2prompt 遵循「include 是白名单exclude 在其上叠加黑名单交集默认丢弃」的简洁心智模型详见 glob_pattern_filter.mdx。其判定逻辑实现在 filter.rs 的should_include_file函数中include 匹配exclude 匹配结果是是丢弃exclude 优先是否收录否是丢弃否否若 include 列表为空则收录否则丢弃由此得出四种组合的最终行为两者都为空保留整个项目树全部文件收录仅有 exclude作为黑名单剔除命中的文件仅有 include作为白名单只保留命中的文件两者都有保留include 命中 ∩ 非 exclude 命中即A \ B。文档中还特别提到早期版本曾考虑过--include-priority之类的「重叠优先」选项但分析表明该行为等价于「只写 include 列表」这一更简单的表达因此该选项已被移除——这正是设计上追求单一清晰语义的体现。七、源码级原理从模式字符串到匹配引擎7.1 模式规范化与花括号展开filter.rs 中的build_globset函数负责把用户输入的字符串模式编译成高效的globset::GlobSet基于 Rust 的globset库其间做了两件关键的事花括号展开检测到模式中含有{时调用bracoxide::explode将{a,b}*.txt这类模式展开为多条独立模式这正是第四节示例 3、5 在底层能生效的原因路径前缀归一化如果模式中不含/即纯文件名级模式自动加上**/前缀使其能在任意目录层级命中同时剥离开头的./。例如用户写*.txt实际编译为**/*.txt从而保证「任意子目录下的 txt 都会被匹配」。7.2 相对路径约束should_include_file的文档注释明确要求传入的path必须是相对于仓库根目录的相对路径绝对路径无法得到正确的匹配结果。这在测试中被反复验证见 filter_test.rs例如strip_prefix得到相对路径后再喂给匹配引擎。7.3 测试用例验证filter_test.rs 为上述语义提供了完整的行为契约典型用例包括空 include/exclude 时全部收录仅 exclude*.txt时按扩展名剔除仅 include*.py时只留 Python 文件同时使用**/*.py与**/uppercase/*时exclude 优先于 include花括号展开lowercase/{foo,bar,baz}.py、{a,b}*.txt风格在 include 与 exclude 两侧均可正常工作大小写敏感匹配lowercase与uppercase目录互不干扰。这些测试既印证了上文六、七节的语义描述也为你编写自己的过滤规则提供了「先验证后使用」的参照样本。八、实战建议与注意事项能写**就不要依赖单层**.rs经过归一化后等价于**/*.rs可放心用于任意深度但如果需要精确限制层级可以显式写出目录结构如src/**。花括号是「与路径无关」的展开*.{jpg,png}会被展开成*.jpg与*.png两条规则因此可以安全地放在 include/exclude 中。排除优先当文件同时命中 include 与 exclude 时它会被丢弃。想「保留大多数、剔除少数」就用仅 exclude想「只留特定子集」就用仅 include两者搭配时注意交集会被丢弃。注意大小写与隐藏文件默认匹配区分大小写若需收录.gitignore等隐藏文件需要配合hidden配置项见 configuration.rs而不是单纯依赖 glob 模式。过滤发生在生成 Prompt 之前合理的 include/exclude 策略能显著压缩输入 token 数避免把二进制、构建产物、文档残留等噪声带进 LLM 上下文直接影响 prompt 质量与成本。九、总结Glob 模式以其灵活直观的语法成为 code2prompt 控制「代码库 → Prompt」文件范围的核心机制。本文从*、?、[]、[!]、**、{}六类通配符出发完整覆盖了基础与高级用法及五种典型示例并进一步结合 filter.rs、args.rs、filter_test.rs 等源码与测试还原了模式编译、路径归一化、花括号展开与 include/exclude 优先级判定等底层细节。无论是脚本自动化、文件管理还是为 LLM 精心裁剪代码上下文掌握 glob 模式都能显著提升你对文件集合的掌控力与处理效率。【免费下载链接】code2promptA CLI tool to convert your codebase into a single LLM prompt with source tree, prompt templating, and token counting.项目地址: https://gitcode.com/GitHub_Trending/co/code2prompt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表