如何为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行以内的小脚本实现同步逻辑,完全可控无冗余功能:
- 脚本读取
pyproject.toml中tool.poetry.dev-dependencies下对应工具的版本号 - 解析
.pre-commit-config.yaml,匹配对应仓库的rev字段,替换为读取到的版本号 - 将脚本加入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
相关产品推荐
相关产品推荐

