로컬에서 작업한 뒤 커밋할 때 코드를 자동으로 lint, format 해주는 방법에 대해서 알아보겠습니다. Git hook 중에서 pre-commit 은 commit 이 레포지토리에 반영되기 전 단계를 말하는데, 이 때 black 으로 코드 포매팅을하고 flake8 으로 lint 를 하는 로직을 추가할 수 있습니다.
Python pre-commit Framework
pre-commit 이란 파이썬 프레임워크를 활용하면 다음과 같이 이를 간단히 구현할 수 있습니다.
- 먼저 pre-commit 을 패키지로 설치해주세요(
pip install pre-commit
) - pre-commit 을 requirements.txt 에 추가해줍니다.
.pre-commit-config.yml
파일을 생성하여 훅을 정의합니다pre-commit install
명령으로 정의한 훅을.git/
폴더에 설치합니다.
.pre-commit-config.yml
파일은 다음과 같이 설정하면 됩니다.
repos:
- repo: https://github.com/ambv/black
rev: stable
hooks:
- id: black
language_version: python3.6
- repo: https://gitlab.com/pycqa/flake8
rev: 3.7.9
hooks:
- id: flake8
Black Configuration
다음과 같이 프로젝트 루트 디렉터리에 pyproject.toml
파일을 생성하면 black 이 코드 포매팅을 할 때 정의된 규칙을 바탕으로 수행하게 됩니다.
[tool.black]
line-length = 79
include = '\.pyi?$'
exclude = '''
/(
\.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
)/
'''
Flake8 Configuration
마찬가지로 프로젝트 루트 디렉터리에 .flake8
을 추가하면 정의된 규칙을 바탕으로 린트를 하게 됩니다.
[flake8]
ignore = E203, E266, E501, W503, F403, F401
max-line-length = 79
max-complexity = 18
select = B,C,E,F,W,T4,B9
여기서 나열된 알파벳은 lint code 의 이니셜 문자로, 해당 알파벳이 포함된 모든 규칙을 지칭합니다.
그리하여 결과적으로 다음과 같은 git workflow 가 만들어지게 됩니다.