You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为poetry和pre-commit的依赖包版本设置单一真值源?

解决方案

这里提供两种轻量无入侵的方案,都以pyproject.toml中的poetry开发依赖为唯一真值源,无需手动维护两处版本,也不用修改pre-commit原生运行逻辑、不需要切换language: system配置。

方案1:使用poetry轻量插件自动同步

直接使用专门的poetry插件完成同步,配置成本极低:

  • 安装插件:poetry self add poetry-plugin-sync-pre-commit
  • 每次升级poetry开发依赖后,执行同步命令即可自动更新pre-commit配置中的版本号:poetry sync-pre-commit
  • 也可以配置poetry的生命周期钩子,在poetry update运行后自动触发同步,无需手动执行

该方案不需要修改任何项目原有配置,完全兼容你现有的技术栈使用习惯。

方案2:自定义极简脚本实现同步

如果不想引入额外插件,可以自己写100行以内的小脚本实现同步逻辑,完全可控无冗余功能:

  1. 脚本读取pyproject.toml中tool.poetry.dev-dependencies下对应工具的版本号
  2. 解析.pre-commit-config.yaml,匹配对应仓库的rev字段,替换为读取到的版本号
  3. 将脚本加入poetry自定义命令或pre-commit的自校验钩子,每次修改依赖后自动运行

核心逻辑示例:

import toml
import yaml
from pathlib import Path

# 读取poetry中目标工具的版本
pyproject = toml.load(Path("pyproject.toml"))
dev_deps = pyproject["tool"]["poetry"]["dev-dependencies"]
target_tools = {"black", "flake8", "isort", "mypy"}
tool_versions = {}
for tool in target_tools:
    version_spec = dev_deps[tool]
    # 处理对象格式的版本声明(比如black的allow-prereleases配置)
    if isinstance(version_spec, dict):
        version_spec = version_spec["version"]
    # 提取版本号,可根据自己的版本约束规则调整提取逻辑
    clean_version = version_spec.lstrip("^>=<~*").split(",")[0]
    tool_versions[tool] = clean_version

# 替换pre-commit配置中的版本号
precommit_path = Path(".pre-commit-config.yaml")
precommit_config = yaml.safe_load(precommit_path.read_text())
for repo in precommit_config["repos"]:
    for tool_name, version in tool_versions.items():
        if tool_name in repo["repo"]:
            repo["rev"] = version

yaml.dump(precommit_config, precommit_path.open("w"), sort_keys=False)

该方案不需要引入任何额外的项目级依赖,逻辑完全透明可自定义,远轻于Cookiecutter这类模板方案。

内容的提问来源于stack exchange,提问作者floatingpurr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:03