简单版ripgrep实现总结

概述

依据对ripgrep的学习,实现简单的个人版本的tbt_ripgrep,简单的有以下功能

  • 基本搜索
  • 添加选项(忽略大小写,行号)
  • 彩色输出
  • 支持递归搜索目录
  • 支持正则表达式
  • 显示上下文
  • 性能优化(加多线程,优化大文件处理,做性能对比)

功能实现

命令行参数解析使用的clap库,彩色输出也是用的colored库,正则匹配也是用的regex库,基于上述三个库提供的功能,功能实现的主要难点主要在上下文显示递归搜索目录。其中递归搜索目录也是基于walkdir库实现的,但是主要是想学习ripgrep的目录发现思路。


程序对比

  1. ripgrep的职责分离做的很好,以Searcher为例,如果以我自己的想法的话,是会把Path放进Searcher中的,但是这样会这样,search方法就需要处理文件系统问题,包括但不限于以下内容,但那些都不是搜索的核心逻辑:
    • 需要处理文件系统错误
    • 需要处理符号链接
    • 需要处理文件类型判断
  2. 基于以上的差异,本质上是我没有做好职责分离,我是基于“是什么”去实现功能的,但是ripgrep是基于“做什么”去实现代码的,做好职责分离,感觉也算是面向抽象编程的殊途同归了吧。
  3. 显示上下文虽然功能是实现了,但是设计的不是很优雅,单个文件的搜索结果都会存储下来,然后统一打印出来,单个匹配文件过多的时候,效率低下的缺点就会放大了,目前对ripgrep的实现还不是很清楚,但是很好奇是如何实现的。ripgrep是如何做到流式处理 + 上下文功能处理的呢?
  4. ripgrepwalk实现也是很值得学习的,我原本的实现也就是对walkdir返回的迭代器进行遍历就行,但是ripgrep对文件遍历进行了功能处理,WalkBuilder,WalkEventIterWalk都是,我觉得这些都是很值得学习的

优先考虑做什么而不是是什么去实现功能,面向行为编程优于面向对象编程,做好职责分离。

使用 Hugo 构建
主题 StackJimmy 设计