配置pre-commit引用pyproject.toml依赖,避免重复维护
解决pre-commit pylint钩子依赖重复维护的问题
pre-commit本身不支持直接让钩子的additional_dependencies字段引用pyproject.toml中的配置项,但可以通过以下变通方案避免重复维护依赖列表:
方案一:让钩子环境安装当前项目(推荐)
在.pre-commit-config.yaml的pylint钩子配置中,通过additional_dependencies安装当前项目的可编辑版本,这样项目的所有依赖会自动被引入钩子环境,无需手动罗列:
- repo: https://github.com/PyCQA/pylint rev: v2.17.5 # 替换为你使用的pylint版本 hooks: - id: pylint additional_dependencies: ["-e", "."]
如果你的项目有单独的开发依赖组(比如pyproject.toml中定义了[project.optional-dependencies] dev = [...]),可以改为安装包含开发依赖的版本:
additional_dependencies: ["-e", ".[dev]"]
这个方法的核心是利用pip的可编辑安装,让pre-commit的隔离环境自动同步pyproject.toml中的所有依赖,彻底避免重复维护。
方案二:动态生成钩子依赖配置
如果仅需要同步特定依赖而非整个项目,可以编写简单脚本读取pyproject.toml的依赖并更新.pre-commit-config.yaml:
- 创建Python脚本(比如
sync_pre_commit_deps.py):
import tomllib import yaml # 读取pyproject.toml中的依赖 with open("pyproject.toml", "rb") as f: pyproject_data = tomllib.load(f) project_deps = pyproject_data["project"]["dependencies"] # 读取并更新pre-commit配置 with open(".pre-commit-config.yaml", "r") as f: pre_commit_config = yaml.safe_load(f) for repo_entry in pre_commit_config: if repo_entry["repo"] == "https://github.com/PyCQA/pylint": for hook in repo_entry["hooks"]: if hook["id"] == "pylint": hook["additional_dependencies"] = project_deps break break # 写回更新后的配置 with open(".pre-commit-config.yaml", "w") as f: yaml.dump(pre_commit_config, f, sort_keys=False)
- 在项目依赖更新时运行该脚本,自动同步依赖列表到pre-commit配置中。
注意事项
- 方案一需要确保
pyproject.toml的project.dependencies字段完整包含项目运行所需的所有依赖,否则pip安装时会遗漏。 - 若使用Poetry或Pipenv等包管理工具,也可以在
additional_dependencies中指定poetry install或pipenv install,但需要确保钩子环境中安装了对应的包管理工具,相对方案一复杂度更高。
内容的提问来源于stack exchange,提问作者Liora Milbaum
相关产品推荐
相关产品推荐

