pre-commit mypy dep resolution 不等同于原生运行 mypy

Pre-commit mypy dep resolution not equivalent to running mypy natively

提问人:Faolain 提问时间:8/8/2023 最后编辑:anthony sottileFaolain 更新时间:8/11/2023 访问量:370

问:

将其交叉发布到 SO,因为该问题已被 Github 上的维护者在 repo 上关闭 https://github.com/pre-commit/pre-commit/issues/2951 而没有解决,我无法找出问题的根源/如何解决它。这可能是我遗漏的非常简单的东西,甚至可能是一行更改。非常感谢这里的任何帮助,并缩小正在发生的事情。

tl;dr 当我从 monorepo ( https://github.com/Faolain/mypy-monorepo) 的根目录运行时,我收到以下错误:pre-commit run mypy --all-files

mypy.....................................................................Failed
- hook id: mypy
- duration: 1.68s
- exit code: 1

packages/backend/src/app/domain/analytics/queries.py:6: error: Cannot find implementation or library stub for module named "aiosql"  [import]
packages/backend/src/app/lib/worker/commands.py:11: error: Cannot find implementation or library stub for module named "uvloop"  [import]
packages/backend/src/app/contrib/aiosql/service.py:12: error: Cannot find implementation or library stub for module named "aiosql.queries"  [import]
packages/backend/src/app/contrib/aiosql/service.py:12: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
packages/backend/src/app/domain/analytics/dependencies.py:7: error: Cannot find implementation or library stub for module named "aiosql"  [import]
packages/backend/tests/unit/lib/test_log.py:24: error: Cannot find implementation or library stub for module named "re2"  [import]
Found 5 errors in 5 files (checked 121 source files)

但是,当我通过 CLI 从同一根目录的活动 venv(通过诗歌 shell)运行以下本机命令时,我没有出现任何类型错误。mypy --config-file packages/backend/pyproject.toml packages/backend/srcmypy-monorepo

此外,如果我在aka上运行相同的命令(请参阅:下面的.pre-commit-config.yaml上的注释行),我会得到相同的行为(没有类型错误)。问题是我无法在 github actions 上运行它(因为条目本身不会运行 bash......这可以通过将其包装在 bash 中来补救,但上面提到的相同类型问题浮出水面)。entry:entry: mypy --config-file packages/backend/pyproject.tomlpre-commitentry:...entry: bash -c 'cd packages/backend && mypy --config-file pyproject.toml .'

❯ mypy --config-file packages/backend/pyproject.toml packages/backend/src
Success: no issues found in 92 source files

上下文

上面链接的 mypy-monorepo 只是对这个 repo https://github.com/cofin/litestar-fullstack 的轻微目录结构更改,它有一个工作预提交,因为它是一个平面目录(它是 monorepo 结构的后端)。我想向它添加一个 monorepo 结构,以便前端和后端在同一个 repo 中(以及其他服务)中并存。

我意识到为了做到这一点,我必须移动到 monorepo 的根目录,到目前为止一切顺利。但是,我随后也意识到我需要编辑所有钩子以识别后端 python 所在的位置。我继续为我的所有钩子做这件事。钩子以前有以下内容.pre-commit-config.yaml.pre-commit-config.yamlpyproject.toml.pre-commit-config.yamlmypy

entry: mypy --config-file packages/backend/pyproject.toml效果很好!我得到了 0 个错误,就像前面提到的从根目录运行一样,我认为一切都很好。mypy --config-file packages/backend/pyproject.toml packages/backend/src

我把它推到 Github 上,github 操作运行了......它失败了,因为 mypy 没有被识别为预提交的可执行文件。然后我意识到这不是 bash(我看到了一个之前的问题,由于 pre-commit/issues/1110 和另一个问题的相同原因,无法在条目中完成 cd),相反,我必须将 --config-file 作为参数传递,或者用 bash 包装条目,例如“entry: bash -c 'cd packages/backend && mypy --config-file pyproject.toml .'。entry:entry

但是,无论我做什么,我仍然会遇到这 5 个错误,这些错误在本机运行时似乎不会发生(无论是在 root 存储库的终端中还是在条目的预提交钩子中使用 mypy 命令)。我测试了编辑以查看它是否未被识别,但事实并非如此,就好像我在弹出的更多类型错误中更改了其他设置一样(这是一件好事,因为它表明我相信 pyproject.toml 被正确读取)。我在这里有点不知所措,非常感谢任何帮助。我不确定这是否是没有“从”目录读取的问题,还是需要拥有目录本身的 venv。例如,是否正确读取了 env?mypy --config-file packages/backend/pyproject.tomlpyproject.tomlmypypyproject.toml

重现步骤:要非常快速地开始使用并重现mypy-monorepo

mkdir mypy-monorepo
cd mypy-monorepo
git clone https://github.com/Faolain/mypy-monorepo.git .
cd packages/backend
make install
poetry shell

其中 make install as per https://github.com/cofin/litestar-fullstack#install-virtual-environment-and-node-packages 只是看图片

注意:我尝试在可用时在运行之间清理提交前缓存,并出现相同的 5 个错误。

注意 2:slotscheck 似乎适用于 bash,但是当使用 mypy 尝试相同的 bash 包装器时,我仍然会遇到相同的 5 种类型错误。

注意 3:不确定这是否相关,但我陷入了 grepping for mypy 的兔子洞,然后找到我认为是最新的文件夹并检查 pip list/freeze,发现 aiosql 和 uvloop 不包括在内,这与 mypy 上出现的类型问题相同。不确定是否相关。cd ~/.cache/pre-commit

预提交 --version v3.3.3

.pre-commit-config.yaml

repos:
  # I couldn't include the rest because it's triggering the link spam filter on SO.
  # Check above for entire yaml
  - repo: https://github.com/ariebovenberg/slotscheck
    rev: v0.16.5
    hooks:
      - id: slotscheck
        exclude: "test_*|docs|migrations|scripts|packages/frontend"
        entry: bash -c 'cd packages/backend && env PYTHONPATH=src slotscheck'
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: "v1.4.1"
    hooks:
      - id: mypy
        exclude: "packages/frontend"
        # entry: mypy --config-file packages/backend/pyproject.toml
        args: ["--config-file", "packages/backend/pyproject.toml"]
        # args: [--config-file=./packages/backend/pyproject.toml]
        # entry: mypy --config-file packages/backend/pyproject.toml
        # entry: bash -c 'cd packages/backend && mypy --config-file pyproject.toml .'
        additional_dependencies:
          [
            pydantic,
            pydantic-settings,
            pylint-pydantic,
            jinja2,
            hiredis,
            passlib,
            rich,
            packaging,
            click,
            rich-click,
            polyfactory,
            structlog,
            aiosmtplib,
            alembic,
            asyncpg,
            asyncpg-stubs,
            httpx,
            pytest,
            pytest-docker,
            saq,
            https://github.com/litestar-org/litestar/archive/refs/heads/main.zip,
            types-freezegun,
            types-python-jose,
            types-click,
            types-redis,
            types-passlib,
            types-click,
            types-PyYAML,
            uvicorn,
          ]
mypy monorepo pre-commit-hook 预提交 pre-commit.com

评论

1赞 STerliakov 8/9/2023
。看到 AIOSQL 和 UVLoul 不包括在内......您是否尝试过将它们添加到?additional_dependencies
0赞 Faolain 8/15/2023
嘿,@STerliakov欣赏它!这就是我最终为了“修复它”而做的事情,但我不明白为什么在没有它的情况下运行命令不会失败。

答: 暂无答案