pre-commit未识别pip-tools子目录pyproject.toml文件问题排查
问题原因分析
你的pre-commit钩子配置存在两个核心问题,导致子目录的pyproject.toml无法被正确处理:
- 硬编码输出路径:钩子的
args里固定指定了输出文件为根目录的pyproject.lock,无论哪个子目录的文件触发钩子,都会覆盖根目录的lock文件,且不会处理子目录的依赖。 - 未动态传递输入文件路径:默认情况下,pip-compile会读取当前工作目录下的
pyproject.toml,而pre-commit默认在仓库根目录执行钩子,所以即使匹配到子目录的文件,pip-compile仍然只会读取根目录的pyproject.toml,而非触发钩子的子目录文件。
解决方法
调整钩子配置,让它针对每个匹配到的pyproject.toml单独处理,并在对应目录生成lock文件:
--- files: \.(toml)$ # 可缩小匹配范围,仅针对toml文件 repos: - repo: https://github.com/jazzband/pip-tools rev: 7.3.0 hooks: - id: pip-compile name: Run pip-compile for 'prod' env. args: - --generate-hashes - --strip-extras - -o - '{{ dirname }}/pyproject.lock' # 动态生成对应目录的lock文件 pass_filenames: true # 让钩子接收匹配到的每个文件路径作为参数
关键配置说明
pass_filenames: true:强制pre-commit将每个匹配到的pyproject.toml文件路径传递给pip-compile,确保钩子处理的是触发它的具体文件。{{ dirname }}/pyproject.lock:使用pre-commit内置的模板变量{{ dirname }},获取当前文件所在的目录,将lock文件生成在与pyproject.toml同一目录下,避免覆盖根目录文件。- 缩小
files匹配范围:如果只需要处理pyproject.toml,可以将files改为\.(toml)$,减少不必要的钩子触发。
内容的提问来源于stack exchange,提问作者Opal
相关产品推荐
相关产品推荐

