GIT

[GIT] Pre-commit 사용법 및 설정 가이드

Jong_seoung 2024. 5. 17. 14:04
반응형

장고 프로젝트에서 코드의 품질을 유지하고 코드 검사를 자동화하여 실수를 줄 일 수 있는 방법 중 하나인 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

 

반응형