提问人:Faolain 提问时间:8/8/2023 最后编辑:anthony sottileFaolain 更新时间:8/11/2023 访问量:370
pre-commit mypy dep resolution 不等同于原生运行 mypy
Pre-commit mypy dep resolution not equivalent to running mypy natively
问:
将其交叉发布到 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/src
mypy-monorepo
此外,如果我在aka上运行相同的命令(请参阅:下面的.pre-commit-config.yaml上的注释行),我会得到相同的行为(没有类型错误)。问题是我无法在 github actions 上运行它(因为条目本身不会运行 bash......这可以通过将其包装在 bash 中来补救,但上面提到的相同类型问题浮出水面)。entry:
entry: mypy --config-file packages/backend/pyproject.toml
pre-commit
entry:...
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.yaml
pyproject.toml
.pre-commit-config.yaml
mypy
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.toml
pyproject.toml
mypy
pyproject.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,
]
答: 暂无答案
评论
additional_dependencies