跳转至

Prek

简介

Prek 是用 Rust 重写的 pre-commit,而 pre-commit 是一个用 Python 写的 提交前钩子 框架

安装

# Windows
scoop install prek

使用

prek 是一个钩子运行器,它兼容 pre-commit 的配置文件。因此可能同时需要参考两份文档

仓库中的钩子

首先创建一个配置文件 .pre-commit-config.yaml。这个配置文件使用了 pre-commit 仓库 中的 check-yamlend-of-file-fixer 钩子。关于配置文件的详细说明请阅读 pre-commit 文档

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: check-yaml
      - id: end-of-file-fixer

然后可以使用 prek run 运行这些钩子。当然最好的方式是将钩子集成到 Git 中,这样每次提交前就会自动运行这些钩子。prek CLI 的详细用法请阅读 prek 文档

# 将钩子集成到 Git 中
prek install
# 从 Git 中删除钩子
prek uninstall

自定义钩子

除了使用社区的钩子外,也可以自己编写钩子。官方文档 里有详细的说明。

钩子的幂等性

钩子即一段可自动触发的脚本,因此 幂等性 在这里非常重要。

所谓幂等性,指从一个相同初始状态开始,运行 1 次和运行 n>1 次的结果完全相同。如果违反了幂等性,那么这个脚本就不适合作为钩子。

一个让钩子满足幂等性的简单方法是,首先检查目标是否处于所需的状态,若不处于则改至该状态,若处于则直接退出脚本。

我个人喜欢使用 just 作为入口,方便统一管理命令。下面是一个结合了 justprek 的示例

repos:
  - repo: local
    hooks:
      - id: lint-sh
        name: Shell Lint
        entry: just lint-sh
        language: system
        pass_filenames: false
        priority: 0
  - repo: local
    hooks:
      - id: update-docs
        name: Docs Update
        entry: just update-docs
        language: system
        pass_filenames: false