frontend/개발환경

git hooks, husky, lint-staged

장구루애비 2021. 12. 13. 10:48

git hooks

어떤 이벤트가 생겼을 때 자동으로 특정 스크립트를 실행하도록 할 수 있다. 훅은 Git 디렉토리 밑에 hooks 라는 디렉토리에 저장한다. 기본 훅 디렉토리는 .git/hooks 이다. 이 디렉토리에 가보면 Git이 자동으로 넣어준 매우 유용한 스크립트 예제가 몇 개 있다.

 

Git - Git Hooks

 

Git - Git Hooks

여기서 한가지 알아둘 점은 저장소를 Clone 해도 클라이언트 훅은 복사되지 않는다는 점이다. 만든 정책이 반드시 적용되도록 하려면 서버 훅을 이용해야만 하며 작성은 정책 구현하기 부분을 참

git-scm.com

 

훅의 종류는 클라이언트 훅과, 서버 훅으로 크게 나뉘는데 자세한 내용은 위 북마크를 참고하면 되고, 여기서는 클라이언트 훅 중에 commit 관련 훅만 일부 다룬다.

 

pre-commit

커밋 명령시 커밋할 파일을 대상으로 린트등의 스크립트를 실행할 수 있는 훅이다. 커밋 되기 전에 실행 된다.

 

commit-msg

커밋 명령시 커밋 메시지의 포맷 형식등을 준수하고 있는지 체크할 수 있는 훅이다. 커밋 되기 전에 실행 된다.

 

husky

husky는 git hooks를 프로젝트에서 쉽게 지원하기 위한 도구이다.

 

커밋 또는 푸시할 때 이를 사용하여 커밋 메시지를 린트하고, 테스트를 실행하고, 코드를 린트할 수 있다.

그리고 husky는 모든 git hooks를 지원한다.

 

Husky - Git hooks

 

Husky - Git hooks

 

typicode.github.io

 

husky 사이트에 가면 husk를 다음 처럼 설명한다.

 

Modern native git hooks made easy

 

husky install

husky는 node 기반의 프로젝트에 npm 또는 yarn 으로 쉽게 설치할 수 있다.

npx husky-init && npm install       # npm
# or 
npx husky-init && yarn              # Yarn 1

husky-init은 husky 패키지를 설치하고, 현재 프로젝트의 로컬 git config 중에 core.hooksPath를 현재 디렉터리의 .husky/ 로 변경한다. core.hooksPath가 설정되지 않으면 git hooks의 기본 디렉터리인 .git/hooks/ 디렉터리가 기본값이다.

여기서 core.hooksPath가 .husky/ 로 바뀌었다는 것은 pre-commit 또는 commit-msg 등의 훅을 .husky/ 디렉터리에 위치시켜야지만 해당 훅이 동작한다는 것이다. 즉 .git/hooks/ 디렉터리에 있는 훅을 복사해와도 되고, 수행하고 싶은 쉘을 직접 작성해서 위치시켜도 된다.

 

husky 를 통해 pre-commit 훅에서 커밋 대상의 소스를 eslint 체크하기

.husky/pre-commit 쉘을 다음처럼 작성한다.

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged

 

수동으로 작성해도 되지만 husky add 명령으로 쉘 파일을 만들 수 있다.

npx husky add .husky/pre-commit "npx lint-staged"

 

이제 커밋을 하면 방금 작성한 .husky/pre-commit 쉘에 따라 npx lint-staged 명령이 실행된다.

 

lint-staged

GitHub - okonet/lint-staged: 🚫💩 - Run linters on git staged files

 

GitHub - okonet/lint-staged: 🚫💩 — Run linters on git staged files

🚫💩 — Run linters on git staged files. Contribute to okonet/lint-staged development by creating an account on GitHub.

github.com

lint-staged는 실행 가능한 노드 패키지의 일종으로 현재 git local repository의 staging 영역의 파일들만을 대상으로 lint-staged 설정에 따라 별도의 명령을 수행할 수 있다. lint 또는 prettier 명령을 설정하면 된다.

 

package.json 또는 .lintstagedrc

{
  "lint-staged": {
    "*": "your-cmd"
  }
}

 

eslint와 prettier를 수행하고 싶다면 다음처럼 설정

{
    "lint-staged": {
      "{services,packages}/**/*.{js,ts,jsx,tsx}": [ <-- glob 패턴으로 작성
        "eslint --fix",
        "prettier --write"
      ]
    }
}

 

위 설정은 npx lint-staged 명령이 실행 될 때 읽혀진다.

'frontend > 개발환경' 카테고리의 다른 글

babel은 ts를 어떻게 해석할까?  (0) 2021.12.13
typescript + eslint  (0) 2021.12.13
monorepo에서 eslint 동작방식 정리  (0) 2021.12.13
monorepo와 yarn workspace 소개  (0) 2021.12.13
monorepo 프로젝트 시작하기  (0) 2021.12.13