Hackage搜索——基于Regex的在线代码搜索
你曾经想在Hackage上找到什么吗?如果是的话,那么我就为你准备了这个东西!
.png)
正则表达式是搜索纯文本文件的一种便捷方式,这就是为什么grep 是软件开发人员中的一种流行工具。以至于'grep'成为一个动词:grep这个,grep那个,你知道我的意思,同样的事情也发生在谷歌身上。
有一天,我需要grep所有的Hackage,看看forall ,在Haskell程序中作为一个标识符的使用频率。这样一来,我就可以估计出将forall 成为一个合适的关键词所带来的破坏(目前它是一个伪关键词,只在类型级别的上下文中有特殊意义)。但是为了进行grep,我们需要一个本地的数据拷贝,而Hackage的大小超过了4.5GB(如果我们只考虑最新的软件包版本),所以这可能需要一段时间来下载。
更不用说没有(或者说,在这项工作之前,没有)一个工具来增量地下载所有的Hackage。如果用一个简单的 脚本来做,那么就很难在不重新下载相同软件包的情况下保持本地拷贝的更新。
自然,必须创建一个更好的下载工具,但重要的一点是让别人的电脑来运行它!因此,Hackage Search诞生了。因此,Hackage Search诞生了:一个Hackage的在线grep。只要键入你的查询,就能得到结果。
.png)
在后端,它使用ripgrep(rg)--一个基于Rust的grep替代品。它的速度很快,而且可以产生机器可读的JSON作为输出。根据文档,其regex引擎的语法,"......类似于Perl风格的正则表达式,但缺乏一些功能,如环视和反向参考。作为交换,所有的搜索都以线性时间执行,与正则表达式和搜索文本的大小有关。"
在后端进行一些额外的处理后,结果被按包分组,并在[rg/]端点进行流式处理。前台逐一加载它们,并以人类可读的方式显示它们,突出显示匹配的子串。
来吧,试一试!这里有一个查询,用来寻找推广的列表构造器。 [\s’:\s](https://hackage-search.serokell.io/?q=%5Cs%27%3A%5Cs).有趣的是,这个引号是命名空间消歧义的DataKinds 语法,在: 。然而人们还是喜欢写它,从这个查询的结果可以看出!
.png)
通过点击一个包的名字,你可以展开或折叠关于匹配行的详细信息。这样,你可以折叠结果,看看哪些包受到影响(例如,如果你在估计破损,这是我的用例),或者你可以扩大结果,看看涉及的确切代码。
Hackage搜索的另一个有用的功能是,对于任何匹配的行,你可以点击它的编号,在更广泛的背景下看到它。
.png)
就技术而言,这里是产生的堆栈:
- 后台:Rust(rg) +Haskell
- 前端:TypeScript
- 包装:Nix
我还用Haskell编写了前台的构建脚本。