本文档概述了 ripgrep 的架构,解释了其主要组件以及它们如何协同工作以提供快速且功能丰富的文本搜索功能。有关安装说明,请参阅 安装;有关用法信息,请参阅 基本用法;有关开发详情,请参阅 开发指南。
Ripgrep 是一个面向行的搜索工具,它递归地在目录中搜索正则表达式模式。其架构通过对每个级别的优化进行仔细关注来优先考虑性能。该系统由几个独立的组件组成,它们协同工作以提供高效的搜索功能。
来源:crates/core/main.rs README.md1-50
Ripgrep 组织成几个 Rust crate,每个 crate 都有特定的职责
关键组成部分是
ripgrep 的主入口点位于 main.rs。此函数解析命令行参数,配置搜索行为,并执行相应的操作。
main 函数处理各种执行模式
ripgrep 的命令行界面定义在 flags 模块中,该模块负责
HiArgs 结构HiArgs 结构封装了所有搜索配置,并提供创建搜索操作所需组件的方法。
来源:crates/core/flags/mod.rs1-15 crates/core/main.rs77-94
搜索过程遵循以下步骤
对于并行搜索,ripgrep 使用基于工作程序的模型,其中每个工作程序被分配一个文件进行搜索。结果以同步方式收集和打印。
来源:crates/core/main.rs102-151 crates/core/main.rs160-229 crates/core/search.rs232-373
SearchWorker 是 ripgrep 架构的核心,负责协调
SearchWorker 处理各种文件处理场景
来源:crates/core/search.rs232-373 crates/core/search.rs14-86
ripgrep 使用 ignore crate 进行递归目录遍历和过滤。遍历系统根据以下内容应用过滤器
文件遍历系统负责在尊重 ignore 规则、文件类型过滤器和其他约束的同时,高效地查找所有应被搜索的文件。
来源:crates/core/main.rs152-229 README.md122-135
ripgrep 通过 Printer 枚举支持多种输出格式
| 格式 | 描述 | 使用场景 |
|---|---|---|
| 标准 | 经典的 grep 式输出,带可选的行上下文 | 默认交互式使用 |
| JSON | 结构化的 JSON Lines 格式 | 与其他工具/处理的集成 |
| 总结 | 聚合统计数据,不包含单个匹配项 | 获取计数或文件摘要 |
每个打印机创建一个“接收器”,它接收搜索结果并根据配置的选项进行格式化
来源:crates/core/search.rs193-225 crates/printer/src/hyperlink_aliases.rs1-37
ripgrep 提供了几个扩展点来增强其功能
ripgrep 支持除 UTF-8 之外的多种文本编码
来源:crates/core/search.rs93-163 README.md135-152 crates/flags/doc/version.rs30-76 tests/feature.rs1-50