Husky โ
๐งฉ Reference
- Husky: Git hooks๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ
- Git hooks: Git ์ด๋ฒคํธ(์ปค๋ฐ, ํธ์ ๋ฑ) ๋ฐ์ ์ ์๋์ผ๋ก ์คํ๋๋ ์คํฌ๋ฆฝํธ
- pre-commit: ์ปค๋ฐ ์ ์ ์คํ๋๋ Git hook
์ Husky๊ฐ ํ์ํ ๊น? โ
ํ ํ๋ก์ ํธ๋ฅผ ํ๋ค ๋ณด๋ฉด ์ด๋ฐ ์ํฉ์ด ์๊ธด๋ค:
- ์ปค๋ฐ ํ์ ESLint ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋ค์ ์ปค๋ฐ
- ํฌ๋งท์ด ๋ง์ง ์๋ ์ฝ๋๊ฐ ์ฌ๋ผ์์ ๋ฆฌ๋ทฐ ์๊ฐ ๋ญ๋น
- ํ์ ์ค๋ฅ๊ฐ ์๋ ์ฝ๋๊ฐ ๋จธ์ง๋์ด ๋น๋ ์คํจ
์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ปค๋ฐ ์ ์ ์๋์ผ๋ก ๊ฒ์ฌํ๋ฉด ๋ถํ์ํ ์ปค๋ฐ๊ณผ ๋ฆฌ๋ทฐ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
Husky๋ Git hooks๋ฅผ ํ๋ก์ ํธ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ค. ์ด๋ฅผ ํตํด ํ ์ ์ฒด๊ฐ ๋์ผํ ์ปค๋ฐ ๊ท์น์ ๊ณต์ ํ ์ ์๋ค.
๐งฉ ํ๋ก์ ํธ์ ์ ์ฉํ๋ฉด์ ๊นจ๋ฌ์ ์
- Git hooks๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ๊ฒ๋ณด๋ค Husky๋ฅผ ์ฐ๋ ๊ฒ ํจ์ฌ ํธํ๋ค.
- ์ปค๋ฐ ์ ์๋ ๊ฒ์ฌ๋ก
์ปค๋ฐ ํ ์์ โ ๋ค์ ์ปค๋ฐ์ฌ์ดํด์ ์ค์ผ ์ ์๋ค. - ํ์ ๊ฐ ์ฝ๋ ํ์ง ๊ธฐ์ค์ ์๋์ผ๋ก ๊ฐ์ ํ ์ ์๋ค.
Git hooks๋? โ
Git hooks๋ Git ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์๋์ผ๋ก ์คํ๋๋ ์คํฌ๋ฆฝํธ๋ค.
์ฃผ์ Git hooks:
pre-commit: ์ปค๋ฐ ์ ์ ์คํcommit-msg: ์ปค๋ฐ ๋ฉ์์ง ์์ฑ ํ ์คํpre-push: ํธ์ ์ ์ ์คํ
์ด ํ๋ก์ ํธ์์๋ pre-commit hook์ ์ฌ์ฉํ์ฌ ์ปค๋ฐ ์ ์ ESLint, Prettier, Type Check๋ฅผ ์๋์ผ๋ก ์คํํ๋ค.
Husky vs ์ง์ Git hooks ๊ด๋ฆฌ โ
์ง์ Git hooks ๊ด๋ฆฌ์ ๋ฌธ์ ์ โ
Git hooks๋ .git/hooks/ ๋๋ ํฐ๋ฆฌ์ ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผ ํ๋ค.
# .git/hooks/pre-commit (Git์ ํฌํจ๋์ง ์์)
#!/bin/sh
npm run lint
npm run type-check๋ฌธ์ ์ :
.gitํด๋๋ Git์ ํฌํจ๋์ง ์์ ํ์๊ณผ ๊ณต์ ๋ถ๊ฐ- ๊ฐ ํ์์ด ์๋์ผ๋ก ์ค์ ํด์ผ ํจ
- ์คํฌ๋ฆฝํธ ์์ ์ ๋ชจ๋ ํ์์๊ฒ ๊ณต์ง ํ์
Husky์ ์ฅ์ โ
Husky๋ Git hooks ์ค์ ์ ํ๋ก์ ํธ ํ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
.husky/ํด๋๊ฐ Git์ ํฌํจ๋์ด ํ์๊ณผ ์๋ ๊ณต์npm install์ ์๋์ผ๋ก Git hooks ์ค์ - ์์ ์ฌํญ์ด ์๋์ผ๋ก ๋ชจ๋ ํ์์๊ฒ ์ ์ฉ
์ค์น ๋ฐ ์ค์ โ
1. Husky ์ค์น โ
npm install -D husky2. Husky ์ด๊ธฐํ โ
npx husky init์คํ ์ ๋ค์๊ณผ ๊ฐ์ ๋ณํ๊ฐ ์๊ธด๋ค:
.husky/ํด๋ ์์ฑpackage.json์prepare์คํฌ๋ฆฝํธ ์ถ๊ฐ.husky/pre-commitํ์ผ ์์ฑ (๊ธฐ๋ณธ ์์)
// package.json
{
"scripts": {
"prepare": "husky"
}
}prepare ์คํฌ๋ฆฝํธ๋?
prepare๋ npm์์ ์ ์ํ ํน์ ์คํฌ๋ฆฝํธ๋ก, npm install ์คํ ์ ์๋์ผ๋ก ์คํ๋๋ค.
์ด๋ฅผ ํตํด ํ์์ด ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ๊ณ npm install์ ์คํํ๋ฉด Husky๊ฐ ์๋์ผ๋ก Git hooks๋ฅผ ์ค์ ํ๊ฒ ๋๋ค.
3. pre-commit hook ์ค์ โ
.husky/pre-commit ํ์ผ์ ์์ ํ์ฌ ์ปค๋ฐ ์ ์ ์คํํ ๋ช
๋ น์ด๋ฅผ ์ค์ ํ๋ค.
# .husky/pre-commit
npx lint-staged์ด์ git commit ์คํ ์ ์๋์ผ๋ก lint-staged๊ฐ ์คํ๋๋ค.
lint-staged์์ ๊ด๊ณ
Husky๋ ์ธ์ ์คํํ ์ง(์ปค๋ฐ ์ )๋ฅผ ๋ด๋นํ๊ณ ,lint-staged๋ ๋ฌด์์ ์คํํ ์ง(ESLint, Prettier, Type Check)๋ฅผ ๋ด๋นํ๋ค.
์์ธํ ๋ด์ฉ์ lint-staged ๋ฌธ์๋ฅผ ์ฐธ๊ณ .
์คํ ํ๋ฆ โ
๊ฐ๋ฐ์๊ฐ git commit ์คํ
โ
Husky์ pre-commit hook ์คํ
โ
lint-staged ์คํ
โ
๋ณ๊ฒฝ๋ ํ์ผ์ ๋ํด ESLint, Prettier, Type Check ์คํ
โ
๋ชจ๋ ํต๊ณผํ๋ฉด ์ปค๋ฐ ์๋ฃ
์คํจํ๋ฉด ์ปค๋ฐ ์ค๋จHusky ์ฐํํ๊ธฐ (๊ธด๊ธ ์ํฉ) โ
ํน๋ณํ ๊ฒฝ์ฐ Husky๋ฅผ ์ผ์์ ์ผ๋ก ๊ฑด๋๋ธ ์ ์๋ค.
git commit --no-verify -m "urgent fix"๐จ ์ฃผ์
--no-verify๋ ๊ธด๊ธํ ์ํฉ์์๋ง ์ฌ์ฉํด์ผ ํ๋ค.
๋จ๋ฐํ๋ฉด Husky๋ฅผ ์ค์ ํ ์๋ฏธ๊ฐ ์์ด์ง๋ค!
๐ก ์ ๋ฆฌ
- Husky๋ Git hooks๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ค.
.husky/ํด๋๋ฅผ ํตํด Git hooks ์ค์ ์ ํ์๊ณผ ๊ณต์ ํ ์ ์๋ค.prepare์คํฌ๋ฆฝํธ๋กnpm install์ ์๋์ผ๋ก Git hooks๋ฅผ ์ค์ ํ๋ค.- ์๋ก์ด ํ๋ก์ ํธ์์๋:
- pre-commit โ lint-staged ์คํ
- lint-staged โ ESLint + Prettier ์คํ
๊ตฌ์กฐ๋ก ์ปค๋ฐ ํ์ง์ ์๋ ๊ด๋ฆฌํ๋ค.