【问题标题】:Pre-commit flake8 with setup.cfg in subfolder在子文件夹中使用 setup.cfg 预先提交 flake8
【发布时间】:2021-06-03 13:13:14
【问题描述】:

我使用flake8 和一堆插件(flake8-docstringsflake8-isortflake8-black)。我已将它们全部预安装到 venv

我的 repo 将通过 pre-commit 进行检查:

  • 根文件夹有两个包
  • 每个都有自己的
    • pyproject.toml(配置blackisort
    • setup.cfg(配置flake8pydocstyle
├── foo
│   ├── pyproject.toml
│   ├── setup.cfg
│   └── (the package)
├── bar
│   ├── pyproject.toml
│   ├── setup.cfg
│   └── (the package)
└── venv

我想通过pre-commit 为这两个包调用flake8

这是我目前的做法:

---
repos:
  - repo: local
    hooks:
      - id: flake8-foo
        name: Run flake8 in foo package
        entry: bash -c "cd foo && flake8"
        language: python
      - id: flake8-bar
        name: Run flake8 in bar package
        entry: bash -c "cd bar && flake8"
        language: python

当我运行pre-commit run --all-files 并且foo 出现错误时,它会多次打印相同的输出:

./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
./path/in/foo/to/file.py:49:1: D401 First line should be in imperative mood
  1. 有没有更好的方法来解决这个问题?
    • 不,我不同意将软件包拆分到自己的存储库中
  2. 如何让错误消息只打印一次?

【问题讨论】:

    标签: pre-commit-hook flake8 pre-commit pre-commit.com


    【解决方案1】:

    pre-commit 在设计上对文件进行操作,它还针对文件进行了优化,可以将 linter 批量运行到多个进程中

    这里发生的情况是您的配置正在运行 bash -c "cd bar && flake8" file1 file2 file3 等的多次调用(每个处理器约 1 次)。

    幸运的是,您可以使用一个设置来解决此问题:

    这样:

    ---
    repos:
      - repo: local
        hooks:
          - id: flake8-foo
            name: Run flake8 in foo package
            entry: bash -c "cd foo && flake8"
            language: python
            pass_filenames: false
            files: ^foo/
            types: [python]
          - id: flake8-bar
            name: Run flake8 in bar package
            entry: bash -c "cd bar && flake8"
            language: python
            pass_filenames: false
            files: ^bar/
            types: [python]
    

    也就是说,通过 repo: local 挂钩,您将失去框架的大部分优势:

    • pre-commit 不管理工具的安装(您的每个开发人员都必须单独安装特定版本的工具)
    • 没有发生任何基于文件名的优化
      • 如果您只更改一个文件,那么您目前正在对整个存储库进行 linting 两次
      • 在合并冲突期间,预提交会优化要运行的文件(而不是整个 repo)
      • 等等

    我建议您的 monorepo 设置仍然以正常方式调用 flake8,但使用 --config 以便它对您的子存储库起作用:

    repos:
    -   repo: https://gitlab.com/pycqa/flake8
        rev: 3.8.4
        hooks:
        -   id: flake8
            name: flake8 ./foo/
            alias: flake8-foo
            files: ^foo/
            args: [--config, foo/setup.cfg]
        -   id: flake8
            name: flake8 ./bar/
            alias: flake8-bar
            files: ^bar/
            args: [--config, bar/setup.cfg]
    

    免责声明:我是 pre-commit 的作者,也是 flake8 的当前维护者

    【讨论】:

    • 感谢您直接回答我的问题并提供更好的整体解决方案@AnthonySottile!你正在为软件社区做伟大的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2018-05-21
    • 2012-07-27
    • 2020-10-16
    • 1970-01-01
    • 2014-10-25
    • 2022-11-04
    相关资源
    最近更新 更多