나는 이렇게 학습한다/Library

pre-commit 을 이용해 commit 전 코드 체크를 자동화하자.

daco2020 2022. 4. 6. 23:57
반응형

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

 

 

 

 

반응형