협업을 하다가 서로 다른 스타일의 코드를 작성하는 부분이 조금 신경쓰였던 적이 있다. python에서는 코드 포매팅을 위한 여러가지 패키지가 존재한다. 이를 활용하여 일관성 있는 코드를 작성하기 위한 환경 구축에 대해 살펴보자.
(참고로 Django 프로젝트에 맞게 세팅을 했다. 다른 python 프레임워크나 환경을 사용하기 위해선 해당 환경에 맞게 세팅을 해야한다.)
먼저, pre-commit을 설치해야 한다. pip 명령어를 사용하여 설치할 수 있다.
pre-commit이란 말그대로 커밋하기 전에 수행하고 싶은 hook을 작성하고 등록하는 것을 돕는 패키지이다. 해당 패키지를 사용하여 hook을 등록하므로써 커밋 이전에 코드 포매팅을 진행할 수 있다.
pip install pre-commit
프로젝트 루트 디렉토리에서 .pre-commit-config.yaml 파일을 생성하고, 필요한 훅을 정의한다. 이 파일은 pre-commit이 실행할 검사들을 정의한다.
예시로 작성한 .pre-commit-config.yaml 파일 내용은 다음과 같다.
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/pre-commit/mirrors-mypy
rev: 'v1.7.0'
hooks:
- id: mypy
additional_dependencies: ['django-stubs']
- repo: https://github.com/psf/black
rev: 24.2.0
hooks:
- id: black
exclude: .*/migrations/.*|.*urls\.py
- repo: https://github.com/pycqa/isort
rev: 5.13.2
hooks:
- id: isort
exclude: .*/migrations/.*
- repo: https://github.com/pycqa/flake8
rev: 7.0.0
hooks:
- id: flake8
args: ['--max-line-length=120', '--ignore=F403,F405,F841']
exclude: .*/migrations/.*
default_language_version:
python: python3.9
위 설정 파일의 훅들의 역할은 다음과 같다.
세부 설정을 .pre-commit-config.yaml 파일에 포함해도 되지만, pyproject.toml과 같은 파일에 분리를 해도 된다. pyproject.toml 파일의 위치도 루트 디렉토리 바로 아래에 위치해야 한다.
아래와 같이 pyproject.toml 파일을 구성하여 검사할 내용의 상세한 부분까지 지정할 수 있다.
[tool.black]
line-length = 120
target-version = ["py39"]
[tool.isort]
profile = "black"
skip = ["__init__.py", "migrations/*"]
multi_line_output = 3
include_trailing_comma = true
[tool.mypy]
python_version = "3.9"
ignore_missing_imports = true
.pre-commit-config.yaml 파일을 작성한 후, pre-commit 훅을 git 훅으로 설정해야 한다(git은 설치가 돼있다고 가정하고 진행). 이를 위해 다음 명령어를 실행한다.
pre-commit install
이 명령어는 pre-commit 훅을 git의 pre-commit 훅으로 등록한다. 이제 커밋을 시도할 때마다 .pre-commit-config.yaml에 정의된 검사가 자동으로 실행된다.
다음은 추가적인 pre-commit 명령어이다.
pre-commit clean(pre-commit에 의해 생성된 캐시를 삭제하는 데 사용. 설정 파일 변경 시 clean -> install)
pre-commit autoupdate(훅들을 최신 버전으로 업데이트)
위 설정을 모두 진행했으면 커밋 시 자동으로 검사가 진행되고 파일이 수정될 것이다. 만약 검사에 실패한다면 수정 후 다시 커밋을 진행하면 된다. 커밋하기 전에 모든 훅을 수동으로 실행하고 싶다면, 다음 명령어를 사용할 수 있다.
pre-commit run --all-files
이 명령어는 모든 파일에 대해 설정된 모든 pre-commit 훅을 실행한다. 참고로 명령어를 실행하는 위치는 장고 프로젝트 루트 디렉토리여야 한다.
참고 자료
https://medium.com/daangn/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%84-%EC%B2%98%EC%9D%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%8F%99%EB%A3%8C%EC%99%80-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%9D%BC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-bb52c3a433fa
https://codeburst.io/tool-your-django-project-pre-commit-hooks-e1799d84551f