Предварительно зафиксируйте flake8 с setup.cfg во вложенной папке

#pre-commit-hook #flake8 #pre-commit #pre-commit.com

#предварительная фиксация-перехват #flake8 #предварительная фиксация #pre-commit.com

Вопрос:

Я использую flake8 с кучей плагинов ( flake8-docstrings , flake8-isort , flake8-black ). У меня все они предварительно установлены в a venv .

Мой репозиторий должен быть проверен pre-commit :

  • Корневая папка содержит два пакета
  • У каждого есть свой
    • pyproject.toml (настраивает black и isort )
    • setup.cfg (настраивает flake8 и pydocstyle )
 ├── foo
│   ├── pyproject.toml
│   ├── setup.cfg
│   └── (the package)
├── bar
│   ├── pyproject.toml
│   ├── setup.cfg
│   └── (the package)
└── venv
 

Я хочу вызвать flake8 via pre-commit для двух пакетов.

Вот как я это делаю в настоящее время:

 ---
repos:
  - repo: local
    hooks:
      - id: flake8-foo
        name: Run flake8 in foo package
        entry: bash -c "cd foo amp;amp; flake8"
        language: python
      - id: flake8-bar
        name: Run flake8 in bar package
        entry: bash -c "cd bar amp;amp; 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. Как я могу напечатать сообщение об ошибке только один раз?

Ответ №1:

pre-commit по замыслу работает с файлами, он также оптимизирован для пакетных запусков линтеров для файлов в нескольких процессах

здесь происходит то, что в вашей конфигурации выполняется несколько вызовов (~ 1 на процессор) bash -c "cd bar amp;amp; flake8" file1 file2 file3 и т. Д. И т. Д.

к счастью, есть настройка, которую вы можете использовать, чтобы исправить это для вас:

с этим:

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

тем не менее, вы теряете большую часть преимуществ фреймворка, переходя на repo: local крючок:

  • предварительная фиксация не управляет установкой инструментов (каждый из ваших разработчиков должен установить инструмент отдельно и в определенной версии)
  • никаких оптимизаций на основе имени файла не происходит
    • если вы меняете только один файл, в настоящее время вы дважды меняете весь свой репозиторий
    • во время конфликтов слияния предварительная фиксация оптимизирует, какие файлы запускать (не весь репозиторий).
    • и многое другое

вместо этого я бы предложил для вашей настройки 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

Комментарии:

1. Спасибо вам как за прямой ответ на мой вопрос, так и за предоставление лучшего общего решения @AnthonySottile! Вы делаете великие дела для сообщества разработчиков программного обеспечения