你是否曾为团队代码风格不统一而头疼?是否在提交代码前,总忘记运行格式化或静态检查工具?如果你是一名开发者,那么对 pre-commit 这个工具一定不会陌生。它就像一个忠诚的“代码门卫”,在代码提交到仓库前,自动执行一系列检查任务,确保代码质量。然而,这个基于Python的工具在速度和易用性上,偶尔也会让人感到一丝“甜蜜的负担”——需要Python环境、安装稍慢、磁盘占用不小。
今天,我们要介绍一个令人兴奋的替代品:prek。它并非简单的模仿,而是用高性能的Rust语言对 pre-commit 进行了彻底的重新设计和工程实现,旨在提供一个更快、无依赖、且完全兼容的现代化选择。它已经获得了CPython、Apache Airflow、FastAPI等知名项目的青睐!
prek Logo一、什么是prek?一个更优秀的“代码门卫”
简单来说,prek 是 pre-commit 的 Rust 重制版。它保留了 pre-commit 所有核心工作流和配置格式,这意味着你现有的 .pre-commit-config.yaml 文件几乎可以无缝迁移。但在此之上,prek 带来了质的飞跃:
- 🚀 单一二进制,零依赖:无需安装 Python 或任何其他运行时环境,下载即用。
- ⚡ 极致的速度:在各项基准测试中,速度是原版
pre-commit 的数倍,且磁盘空间使用效率更高。 - 🔄 100% 配置兼容:直接使用你现有的钩子仓库和配置,迁移成本近乎为零。
- 🏗️ 原生支持 monorepo:内置工作区模式,轻松管理多项目仓库的钩子。
注意:虽然 prek 还很年轻,但它已经足够稳定,正在被越来越多的生产项目所使用。如果你正在寻找 pre-commit 的替代方案,prek 绝对值得一试!
二、prek 的四大核心优势
1. 性能飞升:不仅仅是“快”
速度是 prek 最引以为傲的特性。它通过一系列架构级优化实现了性能的飞跃:
- 并行化处理:并行克隆仓库,并行安装互不依赖的钩子,甚至支持相同优先级的钩子并发运行,大幅缩短端到端的运行时间。
- 共享环境与工具链:重新设计了钩子环境和工具链的管理方式。所有钩子共享 Python、Node.js 等运行时环境,避免了为每个钩子重复安装的浪费,既节省了大量磁盘空间,又加速了安装过程。
- 与
uv 深度集成:使用 Astral 团队开发的超快 Python 包管理器 uv 来创建虚拟环境和安装依赖,效率远超传统 pip。 - 内置原生钩子:用 Rust 原生实现了一些常用钩子(如
trailing-whitespace-fixer),执行速度远超其 Python 版本。
2. 体验优化:开发者友好度拉满
- 开箱即用:告别“你需要先安装Python 3.8+”这类提示。prek 会自动为你安装所需的 Python 版本并配置虚拟环境。
prek run --directory ./src:直接检查指定目录下的文件,无需复杂的 git ls-files 管道操作。prek run --last-commit:仅检查上一次提交中更改的文件。prek run black ruff:可以一次性指定运行多个钩子。
- 清晰的钩子概览:使用
prek list 命令可以清晰列出所有已配置钩子的 ID 和描述。 - 安全的自动更新:
prek auto-update 支持 --cooldown-days 参数,可以设置更新冷却期,有效缓解开源供应链攻击风险。
3. 现代化功能:面向未来的设计
- 内置钩子 (
repo: builtin):提供一系列离线、零配置的常用检查钩子,这是原版 pre-commit 所不具备的。 - 完善的多语言工具链管理:为 Python、Node.js、Bun、Go、Rust、Ruby 提供了改进的、共享的工具链安装方式。
- 丰富的安装渠道:除了直接下载二进制文件,还支持通过 PyPI、Homebrew、Cargo、npm、Nix、Conda 等几乎所有主流的包管理器安装,无缝融入任何开发生态。
4. 强大的生态认可:明星项目都在用
一个工具是否可靠,看看谁在用就知道了。prek 虽然“年轻”,但已迅速被许多顶级开源项目采纳或推荐:
- Python 官方:CPython 项目已在讨论引入 prek。
- Web框架:FastAPI 及其兄弟项目 Typer、Asyncer 已合并引入 prek 的 PR。
- 大数据与平台:Apache Airflow、Apache Iceberg 等顶级数据项目正在评估或使用。
- 前端与工具链:Astral 团队(Ruff、uv 的创造者)也在其多个项目中开始整合 prek。
这份不断增长的名单,是对 prek 稳定性与先进性的最好背书。
三、如何开始使用 prek?安装与迁移指南
安装 prek 简单得超乎想象,总有一种方式适合你:
首选推荐(macOS/Linux):使用独立安装脚本
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/j178/prek/releases/download/v0.3.1/prek-installer.sh | sh
对于 Python 开发者:通过 uv 安装(推荐)
uv tool install prek
# 或者使用 uvx 直接运行
uvx prek --help
其他常用方式:
- Windows (Scoop):
scoop install main/prek - Node.js 项目:
npm add -D @j178/prek - Rust 开发者:
cargo install prek
迁移与快速上手:
- 如果你已是
pre-commit 用户:你的迁移成本极低。只需将命令中的 pre-commit 替换为 prek(例如 prek run --all-files)。大部分情况下,你的 .pre-commit-config.yaml 文件无需任何修改即可工作。官方提供了详细的迁移检查清单,帮助你平滑过渡。 - 如果你是新手:建议从入门指南开始。核心步骤很简单:
- 在项目根目录创建
.pre-commit-config.yaml 文件,定义你需要的钩子(如代码格式化工具 Black、静态检查工具 Ruff)。 - 运行
prek install 来安装 Git 钩子(这将使得每次 git commit 时自动触发 prek)。 - 运行
prek run --all-files 对所有文件进行检查和格式化。
四、不只是“另一个工具”:prek 带来的工作流革新
prek 的出现,不仅仅是一个更快的工具,它代表了开发工具链向高性能、低开销、一体化演进的趋势。Rust 语言带来的内存安全和并发优势,使得像 prek 这样的基础设施工具能够在不牺牲安全性和稳定性的前提下,提供极致的性能。
在实际开发中,特别是在持续集成(CI)环境中,prek 能显著缩短代码检查的流水线时间。对于大型单体仓库(monorepo),其内置的工作区支持能优雅地管理不同子项目的独立配置。对于团队而言,统一的、快速的代码质量守门员,能更有效地保证代码规范,提升协作效率。
五、同类工具对比与未来展望
在代码预提交检查领域,pre-commit 无疑是事实标准。prek 作为其兼容替代者,最大的优势在于性能碾压和体验改良,而非创造一个新范式。其他类似工具如 Lefthook(用 Go 编写)也主打性能,但 prek 的100%配置兼容性让迁移变得无比轻松,这是其杀手锏。
随着 Rust 生态在开发者工具领域的持续发力(如 Ruff 替代 Flake8,uv 替代 pip/pipenv),prek 有望成为这一波“Rust 工具链革命”在代码质量管理环节的关键拼图。其背后活跃的社区和众多明星项目的采用,也预示着它光明的未来。
结语
如果你厌倦了等待 pre-commit 缓慢的安装过程,或者希望为你的 CI 流水线节省宝贵时间,亦或是想尝试一个无需管理 Python 环境、更现代化的开发体验,那么 prek 就是你一直在寻找的答案。
它继承了经典的强大功能,用尖端的技术重塑了性能与体验。正如其 Slogan 所言:“Better pre-commit, re-engineered in Rust”。今天就开始尝试 prek,让你和团队的代码提交之旅,变得前所未有的流畅与高效。