Renovate 的 pre-commit manager 深度指南:启用方式、配置格式与 additional_dependencies 支持

Renovate 的 pre-commit manager 深度指南:启用方式、配置格式与 additional_dependencies 支持 Renovate 的 pre-commit manager 深度指南启用方式、配置格式与 additional_dependencies 支持【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate本篇技术指南聚焦 Renovate 中负责更新 pre-commit 配置依赖的pre-commitmanager讲解其默认禁用原因、两种启用方式、所支持的.pre-commit-config.yaml格式约定以及 Go / Node.js / Python 三种语言的additional_dependencies部分支持。读完本文你将掌握如何在自托管或托管环境中安全地启用该 manager并能依据源码理解其文件识别、URL 解析与数据源选择的全过程。为什么 pre-commit manager 默认是禁用的与大多数默认开启的 manager 不同Renovate 的pre-commitmanager 在defaultConfig中显式设置了enabled: false必须由用户主动开启见 index.ts。这一设计并非技术缺陷而是项目间协作的现实选择Renovate 的版本更新思路与pre-commit autoupdate并不完全一致这种差异曾给pre-commit项目的作者/维护者带来困扰Renovate 团队曾尝试与pre-commit项目协作修复这些差异但提议未被接受因此选择长期默认禁用该 manager官方文档明确提示不要就任何 Renovate 相关问题联系pre-commit项目或维护者。与之对应启用后 Renovate 生成的 PR 描述中会附带一段提示引导用户到 Renovate 仓库的 Discussion 提问而不是去 pre-commit 仓库报问题见 index.ts。如果你希望查看该 manager 的已知问题清单可关注 Renovate 仓库中带有manager:pre-commit标签的 issue原文档中给出了对应的过滤链接。两种启用方式方式一显式配置 enabled在renovate.json中为pre-commit配置块设置enabled: true{ pre-commit: { enabled: true } }方式二使用内置 preset:enablePreCommit在extends数组中追加:enablePreCommit{ extends: [:enablePreCommit] }该 preset 的定义位于 default.preset.ts本质上是把pre-commit.enabled设为trueenablePreCommit: { description: Enable the pre-commit manager., pre-commit: { enabled: true, }, },两种方式等价选择其一即可。需要强调的是只有在显式启用后Renovate 才会扫描并更新 pre-commit 相关文件。支持的文件与格式约定启用后Renovate 默认通过managerFilePatterns匹配文件默认模式为/(^|/)\.pre-commit-config\.ya?ml$/见 index.ts即仓库根目录或任意子目录下名为.pre-commit-config.yaml或.pre-commit-config.yml的文件。你也可以通过managerFilePatterns配置扩展让 Renovate 扫描使用相同格式的其他 YAML 文件。被扫描的文件必须遵循 pre-commit 常规格式即顶层包含repos列表每个 repo 项包含repoGit 仓库地址与rev版本标签repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v1.0.0 hooks: - id: some-hook-id对应地parsing.ts 中的两个启发式判定函数决定文件与依赖是否被识别matchesPrecommitConfigHeuristic仅当解析结果是对象且存在repos键时才认为这是 pre-commit 配置文件matchesPrecommitDependencyHeuristic仅当 repo 项同时存在repo与rev键时才将其视为一个 Git hook 依赖。从源码结构看若 YAML 解析失败、顶层没有repos键、repos为空、或 repo 项缺少rev该文件/依赖都会被跳过这些行为均有对应的单元测试覆盖见 extract.spec.ts。仓库 URL 的解析与数据源选择pre-commit 配置中的repo通常是 Git 仓库地址Renovate 需要从中拆出hostname与depName。在 extract.ts 中支持以下四种 URL 写法URL 形式示例HTTPShttps://github.com/user/repoSCP 风格 SSHgitgithub.com:user/repogit 协议git://github.com/user/repo显式 SSH 协议ssh://gitgithub.com/user/repo解析出的 hostname 会交给determineDatasource选择对应的数据源extract.tsgithub.com或 GitHub 平台 →github-tags数据源gitlab.com或 GitLab 平台 →gitlab-tags数据源Forgejo 平台 →forgejo-tags数据源其他自托管域名如gitlab.mycompany.com、codeberg.org→ 先通过hostRules查找匹配的 host rule若命中github/gitlab/forgejo类型的 rule则使用对应数据源并把该 hostname 作为registryUrls传入若完全没有匹配的 host rule依赖会被标记为skipReason: unknown-registry。因此supportedDatasources仅有三种forgejo-tags、github-tags、gitlab-tags见 index.ts。仓库中的测试夹具 complex.pre-commit-config.yaml 覆盖了 GitHub、GitLab、自建 GitLab 域名、Forgejo/Codeberg、HTTP 前缀、SSH 写法、无效 URL 等多种输入形态可用于直观验证解析行为。另外值得一提的是rev行支持 pre-commit 的 frozen 注释格式即rev: 40位digest # frozen: 版本Renovate 会通过正则提取currentDigest与currentValue并用{{newDigest}} ... # frozen: {{newValue}}模板保持注释格式完成替换见 extract.ts。additional_dependencies 的部分支持Renovate 对 hook 内的additional_dependencies提供部分支持目前仅覆盖 Go、Node.js 与 Python 三种语言。使用前提是必须在 hook 中显式声明language字段否则 Renovate 无法推断依赖类型、不会提取这些附加依赖。源码中正是通过判断hook.language的值golang/node/python来决定走哪条解析路径见 extract.ts。Goadditional_dependencies中的条目写法为模块路径版本内部会被转换为 gomod 的require行后复用 gomod 的 line parser 解析- repo: https://github.com/rhysd/actionlint rev: v1.7.7 hooks: - id: actionlint language: golang additional_dependencies: - github.com/wasilibs/go-shellcheck/cmd/shellcheckv0.10.0Node.js条目写法为包名范围支持^等 semver 范围内部复用 npm manager 的依赖提取逻辑- repo: https://github.com/pre-commit/mirrors-prettier rev: v3.1.0 hooks: - id: prettier language: node additional_dependencies: - trivago/prettier-plugin-sort-imports^5.2.2 - prettier^3.6.2Python条目采用 PEP 508 规范写法如包名版本内部通过 pep621 模块的pep508ToPackageDependency转换为依赖对象- repo: https://github.com/psf/black rev: 19.3b0 hooks: - id: black language: python additional_dependencies: - requests1.1.1此外还有两点细节值得注意meta特殊仓库会被跳过repo: meta是 pre-commit 内置的 meta hooks不支持additional_dependencies源码中会直接跳过其内部 hooks 的附加依赖提取extract.ts无效条目被静默忽略additional_dependencies中的空字符串或无法解析的条目如无效 npm 包名、无效 Go 包不会导致报错而是被跳过测试夹具 complex.pre-commit-config.yaml 中即包含这类用例。不同语言解析出的依赖会被标记为不同的depType见 dep-types.tshook 仓库引用本身为repository附加依赖分别为pre-commit-node、pre-commit-python、pre-commit-golang。而 index.ts 中的defaultConfig.commitMessageTopic: pre-commit hook {{depName}}决定了这类更新 PR 的提交信息主题格式。常见问题与排错线索文件未被识别确认已显式启用 manager且文件名为.pre-commit-config.yaml或.yml若文件名不同需通过managerFilePatterns扩展匹配规则repo 项未生成更新检查该项是否同时具备repo与rev键rev缺失会被启发式判定过滤additional_dependencies 未更新确认 hook 中显式声明了language且语言属于 Go / Node.js / Python 三者之一自托管 Git 平台无更新为该域名配置对应的hostRuleshostType 为 github / gitlab / forgejo否则依赖会被标记为unknown-registry而跳过。若仍有疑问请在 Renovate 仓库发起 Discussion 提问而不要联系pre-commit项目这既符合官方文档的明确指引也能让问题进入正确的维护渠道。【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考