코드로 우주평화
pre-commit 을 이용해 commit 전 코드 체크를 자동화하자. 본문
pre-commit 적용하기
해당 글은 깃헙 레포지토리에서도 확인가능합니다.
pre-commit란?
커밋 메시지를 작성하기 전에 호출이 되는 명령어입니다.
커밋이 되기 전 문법 오류나 스타일, 정렬, 타입 오류 등을 체크할 때 사용합니다.
개발자의 기호에 따라 선택하고 커스텀까지 할 수 있습니다.
pre-commit 적용 순서
1. git init
2. pip install pre-commit
3. pre-commit install
>>> pre-commit installed at .git/hooks/pre-commit
4. pre-commit run
>>> An error has occurred: InvalidConfigError:
=====> .pre-commit-config.yaml is not a file
Check the log at /Users/daco/.cache/pre-commit/pre-commit.log
이렇게 세팅 없이 바로 run을 하면 오류가 뜹니다.
'pre-commit run' 전에 '.pre-commit-config.yaml' 를 세팅해주어야 합니다.
5. '.pre-commit-config.yaml' 파일을 생성하고 다음처럼 작성합니다.(예시)
(파이썬 버전은 사용하는 버전을 적어주세요.)
repos:
- repo: https://github.com/ambv/black
rev: ''
hooks:
- id: black
language_version: python3.8
- repo: https://gitlab.com/pycqa/flake8
rev: ''
hooks:
- id: flake8
- repo: https://github.com/pycqa/isort
rev: ''
hooks:
- id: isort
- repo: https://github.com/necaris/pre-commit-pyright
rev: ''
hooks:
- id: pyright
위에 항목은 예시입니다.
예시에 기재된 라이브러리를 설명하자면 다음과 같습니다.
- black : 코드 포멧터, 코드 스타일을 통일시켜 줍니다.
- flake8 : 코드 린터, PEP8 규악을 지켰는지 검사합니다.
- isort : 파이썬 import를 정렬해주는 라이브러리입니다.
- pyright : 파이썬에서 타입을 체크해주는 라이브러리입니다. (mypy로 대체가능)
항목들은 개발자의 기호에 따라 취사선택할 수 있습니다.
필요하다고 생각하는 것들만 추가하면 됩니다.
rev 에서 ''은 원하는 버전으로 바꿀 수 있습니다.
'pre-commit autoupdate'을 명령을 실행하면 자동으로 버전이 업데이트 됩니다.
6. 다시 pre-commit run
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
isort................................................(no files to check)Skipped
pyright..............................................(no files to check)Skipped
다음과 같은 결과가 나오면 정상입니다.
만약 다른 결과가 나온다면 에러메시지에 따라 수정해주세요.
7. 정상적으로 작동하는지 테스트를 해봅니다.
먼저, 일부러 비정상적인 스타일을 만듭니다.
# main.py (스타일이 안지켜진 코드)
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
터미널에서 다음과 같은 명령어를 실행하면 결과를 확인할 수 있습니다.
# 터미널
>>> git add .
>>> git commit -m "test"
>>> black....................................................................Failed
- hook id: black
- files were modified by this hook
reformatted app/main.py
All done! ✨ 🍰 ✨
1 file reformatted.
flake8...................................................................Passed
isort....................................................................Passed
pyright..................................................................Passed
# main.py (스타일이 올바르게 수정됨)
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
파일이 올바르게 수정되었으므로 다시 git add . 및 git commit -m "메시지"를 수행합니다.
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
isort................................................(no files to check)Skipped
pyright..............................................(no files to check)Skipped
정상적으로 완료되었음을 확인할 수 있습니다.
만약 각 항목별 커스텀이 필요하다면 다음의 파일을 생성해주세요.
8. 커스텀 파일 생성
'setup.cfg' 에 항목별로 커스텀할 내용을 적으면 그에 맞춰서 적용됩니다.
아래는 예시입니다. 본인의 취향에 맞게 작성해주세요.
# setup.cfg
[flake8]
exclude = .git
max-line-length = 80
[isort]
atomic = true
line_length = 80
lines_after_imports = 2
lines_between_types = 1
multi_line_output = 3
black, pyright 의 경우 'pyproject.toml' 파일에 작성합니다.
# pyproject.toml
[tool.black]
line-length = 88
[tool.pyright]
include = ["app"]
exclude = ["**/__pycache__"]
reportMissingImports = true
reportMissingTypeStubs = false
pythonVersion = "3.10.0"
참고. 샘플 디렉토리 구조
.
├── README.md
├── app
│ └── main.py
├── server.py
├── .pre-commit-config.yaml
├── pyproject.toml
└── setup.cfg
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
SQLAlchemy, ‘PasswordType’으로 손쉽게 암호화하자 (0) | 2022.04.12 |
---|---|
Poetry로 프로젝트 패키지를 관리하자 (0) | 2022.04.11 |
pre-commit 에서 ‘flake8’ 과 ‘black’ 커스텀 문제 (0) | 2022.04.07 |
APScheduler를 이용해 비동기 작업을 예약하자 (0) | 2022.01.18 |
Linter 와 Formatter 를 사용해서 깔끔하게 코딩하자 (0) | 2022.01.14 |