Pre-commit中mypy依赖解析与原生运行不一致问题求助
Monorepo下Pre-Commit执行Mypy模块找不到的解决办法
问题根源
Pre-Commit的官方mypy钩子默认会创建独立的虚拟环境,不会复用项目本地的venv,导致钩子环境缺失项目依赖的类型定义包(比如aiosql、uvloop的类型包),从而报错找不到模块。而直接在项目venv里执行mypy命令时,依赖已经安装完整,所以不会出问题。
具体解决方案
方案1:给钩子添加缺失的类型依赖
修改.pre-commit-config.yaml中的mypy钩子配置,通过additional_dependencies字段指定需要的类型包,确保钩子环境能获取到类型定义:
- repo: https://github.com/pre-commit/mirrors-mypy rev: 'v1.5.1' # 替换为你使用的mypy版本 hooks: - id: mypy args: ["--config-file", "packages/backend/pyproject.toml", "packages/backend/src"] additional_dependencies: - aiosql[types] - uvloop[types] # 补充项目其他需要类型检查的依赖包
方案2:复用项目本地的Mypy(Poetry项目推荐)
如果不想重复维护依赖列表,可以让Pre-Commit直接调用项目venv中的mypy,使用本地钩子配置:
- repo: local hooks: - id: mypy name: mypy entry: poetry run mypy args: ["--config-file", "packages/backend/pyproject.toml", "packages/backend/src"] language: system types: [python] pass_filenames: false
注意:GitHub Actions中需要先完成项目依赖安装,执行poetry install后再运行Pre-Commit命令,确保环境正确。
方案3:修复GitHub Actions中Bash包装的执行问题
如果之前尝试用Bash包装命令失败,需显式指定shell并确保钩子环境依赖完整,配置示例:
- repo: https://github.com/pre-commit/mirrors-mypy rev: 'v1.5.1' hooks: - id: mypy entry: bash -c 'cd packages/backend && mypy --config-file pyproject.toml src' language: system types: [python] additional_dependencies: - aiosql[types] - uvloop[types]
验证步骤
- 清理Pre-Commit缓存:
pre-commit clean - 重新安装钩子:
pre-commit install - 执行检查:
pre-commit run mypy --all-files
内容的提问来源于stack exchange,提问作者Faolain
相关产品推荐
相关产品推荐

