预提交未找到 python 包

Tom*_*s B 2 python pre-commit pyenv pre-commit.com

我使用pyenv来支持拥有不同版本的 python。

在使用 python 3.7的项目中,我还希望在进行代码更改时使用预提交进行linting 。

但是当 lint 规则运行时,预提交似乎正在用户下的缓存文件夹中查找 python 包,因此无法找到它们......即使它们安装在系统级别。例如:

>git ci -m'lint test'  
...
...
/Users/[]/.cache/pre-commit/repo180cws4u/py_env-python3.7/lib/python3.7/site-packages/ 
...
ModuleNotFoundError: No module named 'six'


>pip list | grep six
six                 1.11.0
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题。(一位同事通过运行/Users/[]/.cache/pre-commit/repo180cws4u/bin/python install -m six解决了问题,但感觉不对..必须可以配置为使用系统包或类似的......?

Ant*_*ile 6

pre-commit 为每个工具安装隔离的环境,这样它们就不会干扰本地开发。听起来您在该环境中缺少依赖项

pip install非常不支持在缓存环境中运行,这样做很可能会破坏预提交。它们是有意为私有的实现细节,因此您不会弄乱它们!

您有两个主要选择:

使您的脚本独立工作(受支持的方式)

设置您的工具,以便它们正确指定它们的依赖项(您尚未显示您的配置,但我猜您正在调用一些脚本?)

对于获得安装,您的工具的依赖应该在你设置的元数据被列出(通常是setup.py/ setup.cfg/ pyproject.toml

例如,pre-commit/pre-commit-hooks指定这些依赖项

# setup.cfg
install_requires =
    ruamel.yaml>=0.15
    toml
Run Code Online (Sandbox Code Playgroud)

对于local带有的存储库language: python,您应该在additional_dependencies-- 例如:

# setup.cfg
install_requires =
    ruamel.yaml>=0.15
    toml
Run Code Online (Sandbox Code Playgroud)

存储库本地挂钩(逃生舱口)

使用language: system/ language: script,预提交不提供环境。设置这样的环境是每个用户的责任。这些是正常方式的逃生口,因为它们首先违背了框架的目的(即自行提供必要的工具——无需每个开发人员仔细管理一堆工具)

对于repo: local你用language: system,只是希望如果用户的环境配置错误,你的脚本会产生一个有用的错误消息

-   repo: local
    hooks:
    -   id: run-the-thing
        name: run the thing
        entry: ./scripts/lint
        additional_dependencies: [six, ...]
        language: python
        types: [python]
Run Code Online (Sandbox Code Playgroud)

免责声明:我创建了预提交