[GIT] Pre-commit 사용법 및 설정 가이드
장고 프로젝트에서 코드의 품질을 유지하고 코드 검사를 자동화하여 실수를 줄 일 수 있는 방법 중 하나인 Pre-commit에 PEP8 스타일 가이드를 검사하는 pre-commit의 설정과 pre-commit의 사용법에 대해서 작성해 보려고 한다.
Pre-commit 이란?
pre-commit는 Git에서 훅을 관리하고 실행하기 위한 프레임 워크이다. 코드가 커밋되기 전에 자동으로 다양한 검사를 수행하여 코드 품질을 유지하고, 실수를 줄일 수 있도록 도와준다. 예를 들어, 코드 스타일 검사, 정적 분석, 테스트 실행 등을 자동으로 수행할 수 있게 도와준다.
왜 필요할까?
프로젝트의 코드 품질을 유지하는 것은 매우 중요하다. 하지만 스타일 가이드만 예로 들어도 적절한 컨벤션과 스타일 가이드를 매번 확인하기 힘든 게 사실이다. 이런 문제점들을 pre-commit를 이용하면 문제를 어느 정도 방지할 수 있다.
Django 프로젝트에 Pre-commit 설정하기
1. pre-commit 설치
pip install pre-commit
2. pre-commit 설정 파일 생성
프로젝트의 루트 디렉토리에 .pre-commit-config.yaml 파일을 생성한다.
파일의 내용은 아래쪽에 있다.
3. repo에 적용하기
아래 pre-commit 명령어를 직접 입력하는 경우는 거의 없고, commit 명령어시 pre-commit-config의 내용을 모두 진행한 다음 커밋되게 된다.
프로젝트 중간에 pre-commit를 이용하는 경우, pre-commit-config파일 작성 후 2번 명령어로 전체 적용시킨 후 커밋해서 미리 전체 적용을 하고 진행하는 게 좋다.
1. 현재 stage 된 파일에 적용
pre-commit run
2. 현재 repo의 모든 파일에 적용
pre-commit run --all-files
3. 원하는 hook_id 만 실행
pre-commit run <hook_id>
4. pre-commit 적용
pre-commit install
. pre-commit-config 파일 전체 코드
repos:
- repo: https://github.com/pycqa/isort
rev: 5.12.0
hooks:
- id: isort
name: isort (python)
args: ["--profile", "black", "-l", "120", "--skip-gitignore"]
exclude: 'migrations/'
- repo: https://github.com/psf/black
rev: 22.10.0
hooks:
- id: black
args: [--line-length, "120", --skip-magic-trailing-comma]
exclude: 'migrations/'
- repo: https://github.com/pycqa/autoflake
rev: v1.4
hooks:
- id: autoflake
args:
- --in-place
- --remove-all-unused-imports
- --remove-unused-variables
exclude: 'migrations/'
- repo: https://github.com/pycqa/flake8
rev: 5.0.4
hooks:
- id: flake8
args:
["--max-line-length", "120", "--extend-ignore", "E203, F403, F405", "--show-source",]
exclude: 'migrations/'
.pre-commit-config 파일 코드에 대한 설명
isort
import 문을 정리해 주는 라이브러리
- import문을 알파벳 순서로 정리
- 종류(파이썬 표준, 외부 모듈, 내부 모듈) 별로 구분해서 정리
- args: "black" 포맷터와의 호환성, 최대길이는 120으로 설정, gitigonre 파일은 제외
- repo: https://github.com/pycqa/isort
rev: 5.12.0
hooks:
- id: isort
name: isort (python)
args: ["--profile", "black", "-l", "120", "--skip-gitignore"]
Black
대표적인 코드 포멧터
- PEP8을 준수하여 코드의 일관성과, 범용성, 가독성을 높여주는 대포적인 포멧터
- args: 최대 길이는 120, list나 dict의 마지막 요소에 콤마(,)를 통해 개행 금지
- repo: https://github.com/psf/black
rev: 22.10.0
hooks:
- id: black
args: [--line-length, "120", --skip-magic-trailing-comma]
autoflake
- 사용하지 않는 import문이나 변수를 제거해 주는 formatter 제거
- - --expand-star-imports: import문의 *을 사용한 부분을 expand 해줌
- - --remove-duplicate-keys: 객체 내부의 중복되는 key를 모두 제거
- repo: https://github.com/pycqa/autoflake
rev: v1.4
hooks:
- id: autoflake
args:
- --in-place
- --remove-all-unused-imports
- --remove-unused-variables
# - --expand-star-imports
# - --remove-duplicate-keys
flake8
- PEP8의 가이드를 확인해 주는 린터
- args: 최대길이 120, 앞선 포맷들이 수정해주지 못하고 체크된 부분을 보여주고, 직접 수정해야 함
- ignore
- E203: black과 PEP8 호환성으로 인해 제외 필요
- F403, F405: import문에 *을 사용할 경우 에러
- repo: https://github.com/pycqa/flake8
rev: 5.0.4
hooks:
- id: flake8
args:
["--max-line-length", "120", "--extend-ignore", "E203, F403, F405", "--show-source",]
참고
pre-commit.ci
Developers spend a fair chunk of time during their development flow on fixing relatively trivial problems in their code. pre-commit.ci both enforces that these issues are discovered (which is opt-in for each developer's workflow via pre-commit) but also fi
pre-commit.ci
GitHub: Let’s build from here
GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...
github.com