ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

prek 入门实战:用 Rust 原生 Git Hook 管理器替代 pre-commit(配置、命令与内置 Hook 全指南)

prek 入门实战:用 Rust 原生 Git Hook 管理器替代 pre-commit(配置、命令与内置 Hook 全指南) prek 入门实战用 Rust 原生 Git Hook 管理器替代 pre-commit配置、命令与内置 Hook 全指南【免费下载链接】prek⚡ A fast Git hook manager written in Rust, designed as a drop-in alternative to pre-commit, reimagined.项目地址: https://gitcode.com/GitHub_Trending/pr/prekprek是一个用 Rust 重新实现的 Git Hook 管理器设计目标是作为pre-commit的即插即用drop-in替代品用于在提交前或按需运行各类检查格式化、Lint、校验、安全检查与自定义项目检查。本文以仓库中的 Agent 技能文档skills/prek/SKILL.md为核心骨架结合源码crates/prek深入讲解如何配置prek.toml、迁移现有 YAML 配置、安装 Git shim、运行与管理 Hook以及善用repo builtin离线内置 Hook 与 workspace 模式。读完本文你将能够在自己的仓库中独立完成 prek 的接入、验证、运行与排查。prek 是什么它能做什么prek的自我定位在其 CLI 定义中写得非常明确见 cli/mod.rsA fast Git hook manager written in Rust, designed as a drop-in alternative to pre-commit, reimagined.它的核心职责是运行 Hook 来检查代码与仓库文件——包括格式化器、Linter、各类文件校验器、安全检查以及自定义项目检查。具体可以用于运行检查源代码和仓库内容的 Hook安装pre-commit、pre-push、commit-msg等 Git Hook shim壳脚本复用与pre-commit相同的 Hook 生态远程仓库、local、meta为支持的语言管理 Hook 运行时与工具链校验配置、更新固定的 Hook 修订版本、检视已配置的 Hook。典型的使用场景包括代码格式化与 Lint、YAML/JSON/TOML/XML 等文件的合法性校验、以及阻止合并冲突标记、私钥、超大文件、错误行尾等进入提交。从源码结构看prek 实现了完整的命令面初始化、安装 shim、准备环境、运行、列出、校验、更新、缓存管理、转换等cli/mod.rs 中的Command枚举并在ExitStatus中定义了Success(0)/Failure(1)/Error(2)/Interrupted(130)的退出码映射cli/mod.rs。编写配置优先使用 prek.toml对于全新配置SKILL.md 建议优先使用prek.toml仓库根目录已有示例 prek.toml。配置由 config/mod.rs 中的Config结构体承载load_config会根据扩展名自动选择 TOML 或 YAML 解析器config/mod.rs因此.pre-commit-config.yaml同样受支持。四种 repo 类型配置的核心是[[repos]]数组每种 repo 类型在 config/repo.rs 中有对应结构体repo 值含义典型用途远程仓库 URL普通 Hook 仓库如https://github.com/astral-sh/ruff-pre-commit复用 pre-commit 生态的远程 Hooklocal在当前仓库内定义的 Hook项目私有检查、自定义脚本meta配置自检类 Hook如check-hooks-apply、check-useless-excludes、identity校验配置本身builtinprek 的离线 Rust 原生 Hook追求速度、零网络依赖与最小引导最小示例远程仓库示例[[repos]] repo https://github.com/astral-sh/ruff-pre-commit rev v0.14.3 hooks [ { id ruff }, { id ruff-format }, ]local Hook 示例[[repos]] repo local hooks [ { id cargo-fmt, name cargo fmt, language system, entry cargo fmt --, files \\.rs$, }, ]builtin 示例[[repos]] repo builtin hooks [ { id trailing-whitespace }, { id check-yaml }, ]注意上述示例使用了 TOML 1.1 的多行内联表multiline inline tables语法。如果当前工具链中的编辑器或解析器还不支持该语法或者 Hook 字段较多如env、pass_filenames false、priority等SKILL.md 建议改用[[repos.hooks]]数组表array-of-tables写法[[repos]] repo builtin [[repos.hooks]] id trailing-whitespace [[repos.hooks]] id check-yaml文件过滤模式正则与 globprek 的files/exclude字段在 config/pattern.rs 中被建模为FilePattern支持三种形态FilePatternWire反序列化见 config/pattern.rs纯字符串按正则解析这是可移植性最好的选择files \\.rs${ glob ... }使用 glob 匹配files { glob src/**/*.rs }{ glob [..., ...] }支持多根 glob 列表exclude { glob [target/**, dist/**] }。在实现上正则使用fancy_regexUnicode bytes 模式glob 使用globset构建的GlobSetconfig/pattern.rs。仓库测试用例验证了三种形态的解析与匹配行为例如files: { glob: [src/**/*.rs, crates/**/src/**/*.rs] }能匹配crates/foo/src/lib.rs而不匹配tests/main.rsconfig/pattern.rs。glob: []空列表匹配不到任何文件非法 glob如[会被拒绝并报错。调度priority 与并发prek 的 Hook 调度基于prioritypriority数值越小的 Hook 越早运行priority相同的 Hook 可以并发运行顶层priorities表可以为数值优先级声明配置局部的可读别名Hook 的priority接受非负整数或已声明的别名priority只在同一个配置文件内求值不会跨 workspace 项目生效。实现上Priority是一个 untagged 枚举Number(u32)或Alias(PriorityAlias)见 config/priority.rs别名经PriorityAlias反序列化时校验不能为空、不能包含空白且不能以保留前缀开头config/priority.rs。Config::validate_priorities会在配置加载阶段解析所有 Hook 的 priority若引用了未在priorities中声明的别名会抛出UnknownPriorityAlias错误config/mod.rs 与 config/mod.rs。prek 特有的 Hook/配置字段编辑 TOML 时值得掌握的 prek 扩展字段对应Config与HookOptions结构体见 config/mod.rs字段作用env每个 Hook 独立的临时环境变量priorities可读、可复用的优先级别名BTreeMapPriorityAlias, u32priorityHook 排序与并发控制minimum_prek_version门控更新的配置特性解析时会做版本校验见 config/mod.rsorphan true在 workspace 模式下把某个嵌套项目从父配置中隔离出来Config还包含updateprek update的默认选项、default_install_hook_types默认[pre-commit]、default_language_version、default_stages、default_env、全局files/exclude、fail_fast首失败即停止默认 false等字段。此外prek 会宽容地忽略minimum_pre_commit_version与ci这类它不使用的键见 config/mod.rs并会警告未识别的键。另一个值得注意的细节加载配置时若远程 repo 的rev既不含.不像版本号也不是十六进制字符串不像 commit SHAprek 会把它视为可变引用并发出警告建议改用 tag 或 commit SHA或运行prek update选择最新的可用 tagconfig/mod.rs。默认接入工作流在仓库中采用 prek 时SKILL.md 给出的标准流程是检查仓库是否已有.pre-commit-config.yaml或.pre-commit-config.yml如果有通常保留该配置只把命令从pre-commit换成prek若从pre-commit迁移用prek install -f重新安装 Git shim如果没有优先为全新接入创建prek.toml安装prek用prek validate-config校验配置用prek install --prepare-hooks安装 Git shim 并准备 Hook 环境用prek run --all-files完整运行一次对于 monorepo考虑嵌套配置、.prekignore与orphan: true。如果用户明确要求最大化的上游可移植性即与 pre-commit 保持完全一致则应继续使用.pre-commit-config.yaml并避免使用 prek 独有的键如priority、env、orphan等。安装与运行常见安装方式uv tool install prek brew install prek mise use prek cargo binstall prek cargo install --locked prek命令指南SKILL.md 整理了核心命令结合 cli/mod.rs 中的参数定义说明如下prek install把 Git Hook shim 安装到仓库的有效 hooks 目录默认.git/hooks/遵循core.hooksPath。-f/--force可强制覆盖已有 shim-t/--hook-type指定要安装的 shim 类型未指定时使用配置中的default_install_hook_types否则默认pre-commitcli/mod.rsprek prepare-hooks别名install-hooks只准备 Hook 环境不安装 Git shimprek install --prepare-hooks一步完成安装 shim 与准备环境prek run对当前暂存的文件选择运行 Hookprek run --all-files对整个仓库运行 Hookprek run hook-id只运行某一个 Hookprek list列出发现的 Hook 与项目prek validate-config校验prek.toml或.pre-commit-config.yamlprek update别名autoupdate更新固定的 Hook 修订版本prek util yaml-to-toml把已有的 YAML 配置转换为prek.tomlprek util identify path当types、types_or或exclude_types匹配结果与预期不符时检视文件标签。Hook 选择器selector支持三种语法见 cli/mod.rs 中的参数说明hook-id跨项目运行所有同名 Hook、project-path/运行某个项目的全部 Hook、project-path:hook-id只运行指定项目中的指定 Hook可多次指定且--skip同时接受PREK_SKIP或SKIP环境变量逗号分隔。质量提升命令与选项文档中提到的常用质量工具与选项prek run --dry-run演练运行不真正执行prek run --directory dir在指定目录运行prek run --last-commit对上次提交涉及的文件运行prek run --skip hook-or-project跳过指定 Hook 或项目prek -C dir ...全局选项先切换目录再执行cli/mod.rs。其他全局选项包括--config指定备用配置文件、--color、--refresh刷新全部缓存、--no-progress、-q/--quiet可重复-qq进入静默模式、-v/--verbose可重复、--log-filetrace 日志文件默认$PREK_HOME/prek.log等cli/mod.rs。调试技巧prek run -vvv输出更详细的调试信息PREK_NO_FAST_PATH1 prek run对比 builtin fast-path 行为与标准执行路径查阅 docs/reference/environment-variables.md 中PREK_*控制项如PREK_HOME、PREK_SKIP与并发限制等。相关常量定义在 prek-consts/src/env_vars.rs。内置 HookBuiltin Hooks指南prek 有两条重要的 builtin 路径自动 fast path对来自https://github.com/pre-commit/pre-commit-hooks的受支持 Hookprek 自动使用内置的 Rust 实现加速无需下载 Python 环境显式repo: builtin声明式的离线、零配置内置 Hook。当速度、无网络环境或最小引导比上游 pre-commit 兼容性更重要时应优先使用repo: builtin。源码中BuiltinHooks枚举hooks/builtin_hooks/mod.rs与pre_commit_hooks模块hooks/pre_commit_hooks/mod.rs实现了这些 Hook。SKILL.md 列举的文档内内置 Hook 包括trailing-whitespace清除行尾空白check-added-large-files阻止添加超大文件check-case-conflict检查大小写冲突文件check-illegal-windows-names检查非法 Windows 文件名end-of-file-fixer文件末尾换行修复file-contents-sorter文件内容排序fix-byte-order-marker修复 BOMcheck-json、check-json5、check-jsonc、pretty-format-jsonJSON 族校验/格式化check-tomlTOML 校验check-vcs-permalinks检查 VCS 永久链接check-yamlYAML 校验check-xmlXML 校验mixed-line-ending混合行尾检测check-symlinks、destroyed-symlinks符号链接检查check-merge-conflict合并冲突标记检测detect-private-key私钥检测no-commit-to-branch禁止向指定分支提交check-shebang-scripts-are-executableshebang 脚本可执行性检查check-executables-have-shebangs可执行文件 shebang 检查从 builtin_hooks/mod.rs 的导入列表还可看到forbid-new-submodules、requirements-txt-fixer、deny-filename-pattern、deny-pattern等更多内置实现其中 JSON5/JSONC 校验在 builtin_hooks/check_json5.rs 与 builtin_hooks/check_jsonc.rs 中实现是 prek 相对上游的扩展。对 Agent 与开发者的实践建议SKILL.md 最后给出了针对自动化 Agent 的实践准则同样适用于开发者新项目优先prek.toml迁移场景优先保留现有.pre-commit-config.yaml除非用户明确要求 TOMLmonorepo 中优先使用 workspace 模式而不是强行塞一个巨大的根配置可参考 docs/monorepos.md需要离线或零配置 Hook 时考虑repo: builtin如果仓库已在用pre-commit-hooks记住 prek 对其中部分常见 Hook 可以使用内置 Rust 实现fast path从小而精的默认 Hook 集开始再补充项目实际使用的语言相关 Hook迁移时用prek util yaml-to-toml自动转换而不是手工改写 YAML在承诺某个 Hook 语言的完整兼容性之前先在 docs/reference/language-support.md 中核实。更深入的内容完整文档与上手教程docs/index.md、docs/quickstart.md、docs/installation.md、docs/running-hooks.md配置详解与参考docs/configuration.md、docs/reference/configuration.md内置 Hook 全表docs/built-in-hooks.mdCLI 参考与差异说明docs/reference/cli.md、docs/diff.md与 pre-commit 的兼容性边界docs/compatibility.md性能基准docs/benchmark.md一个完整的示例配置可在仓库根目录的 prek.toml 中查看。【免费下载链接】prek⚡ A fast Git hook manager written in Rust, designed as a drop-in alternative to pre-commit, reimagined.项目地址: https://gitcode.com/GitHub_Trending/pr/prek创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表