#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:
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! Вы делаете великие дела для сообщества разработчиков программного обеспечения