本指南旨在帮助希望为 fzf 代码库贡献或修改代码的开发者。它涵盖了从源码构建、核心架构理解、测试框架以及贡献指南。有关使用 fzf 的信息,请参考基本用法或命令行选项。
要构建 fzf,你需要
对于新开发者来说,构建 fzf 最直接的方法是
这会为你的当前平台构建 fzf 二进制文件,并可选地安装 shell 集成脚本、按键绑定和模糊补全。
项目包含一个 Makefile,其中有多个目标
Makefile 使用 git 命令来确定版本和修订信息。如果在 git 信息不可用的环境中构建,请手动设置$FZF_VERSION和$FZF_REVISION。
要构建启用了性能分析选项的 fzf
来源: BUILD.md go.mod1-20
下图展示了构成 fzf 的主要代码组件
| 组件 | 目的 | 文件 |
|---|---|---|
| 终端 | 处理用户输入和显示 | terminal.go |
| 渲染器 | 用于渲染 UI 的接口 | light.go, tcell.go |
| Reader | 处理来自各种来源的输入 | reader.go |
| 匹配器 | 实现模糊匹配算法 | matcher.go |
| 模式 | 处理搜索模式 | pattern.go |
| 选项 | 管理命令行选项 | options.go |
| EventBox | 协调组件之间的事件 | eventbox.go |
下图说明了数据如何在系统中流动
来源: [核心架构图来自提示]
fzf 使用 Go 单元测试和 Ruby 集成测试的组合。
运行单元测试
运行集成测试(需要 tmux)
来源: .github/workflows/linux.yml41-48 .github/workflows/macos.yml41-45
项目使用 GitHub Actions 进行 CI/CD,并进行以下检查
| 检查 | 描述 | 配置文件 |
|---|---|---|
| Linux 测试 | 在 Ubuntu 上进行单元测试和集成测试 | .github/workflows/linux.yml |
| macOS 测试 | 在 macOS 上进行单元测试和集成测试 | .github/workflows/macos.yml |
| 拼写检查 | 确保代码拼写正确 | .github/workflows/typos.yml |
| CodeQL 分析 | 安全漏洞扫描 | .github/workflows/codeql-analysis.yml |
| 依赖项审查 | 检查依赖项问题 | .github/workflows/depsreview.yaml |
来源: .github/workflows/linux.yml41-42 .github/workflows/macos.yml38-39
fzf 依赖于几个第三方库,如go.mod3-11中所列。
| 库 | 目的 |
|---|---|
| github.com/charlievieth/fastwalk | 快速目录遍历 |
| github.com/gdamore/tcell/v2 | 终端处理和渲染 |
| github.com/junegunn/go-shellwords | Shell 单词解析 |
| github.com/mattn/go-isatty | 终端检测 |
| github.com/rivo/uniseg | Unicode 文本分割 |
| golang.org/x/sys | 系统调用 |
| golang.org/x/term | 终端处理 |
fzf 在 MIT 许可下发布,具体规定在BUILD.md58-61。贡献者应注意,他们的贡献也将受相同的许可协议约束。