관리 메뉴

프론트엔드 정복하기

monorepo 에서 pre-commit 훅 구성하기 본문

레파지토리 구성하기

monorepo 에서 pre-commit 훅 구성하기

GROWNFRESH 2023. 10. 10. 18:09

turborepo 를 사용해 monorepo 를 구성했고  git commit  이 이루어지기 전 Linting, Formatting, Type Checking 이 이루어질 수 있도록 husky, lint-staged 를 사용해 pre-commit 훅을 작성했다.

 

eslint 와 prettier 의 경우 각 패키지 설정에 맞게 검사가 이루어졌으나, 타입 체킹은 루트에 있는 tsconfig.json 을 의존해 검사가 원하는대로 되지 않았다. 이에 대한 해결책을 공유하고자 한다.

 

 

프로젝트 구성은 다음과 같았다.

├── packages
|   ├── random-menu
├── apps
│   ├── common-ui
│   └── common-utils
├── package.json

기존 설정

// ./package.json

{
  ...
  "lint-staged": {
    "*.{ts,tsx}": [
       "eslint --cache --max-warnings=0",
       "tsc --noEmit"
     ],
     "*.{ts,tsx,css,md}": "prettier --write"
   }
  ...
}
// ./husky/pre-commit

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

npx lint-staged

 

위와 같이 설정했을 때, 루트 tsconfig.json 을 토대로 tsc 를 실행해서 타입 검사가 제대로 이루어지지 않았다. 따라서 각 패키지 내에서 따로 타입검사를 해줘야 했다.

 


 

먼저 apps 또는 packages 내 패키지/앱들의 하위 package.json 에 아래 스크립트를 추가한다.

{
  "scripts": {
    "type-check": "tsc --noEmit" 
  }
}

 

이제 루트 package.json 의 lint-staged 을 아래처럼 구성한다. pnpm 패키지 매니저의 filter 옵션을 이용해서 특정 패키지/앱 내 파일이면 해당 앱/패키지에서 type-check 스크립트를 실행할 수 있도록 설정했다.

// ./package.json

{
  "lint-staged": {
    "*.{ts,tsx}": "eslint --cache --max-warnings=0",
    "*.{ts,tsx,css,md}": "prettier --write",
    "./apps/random-menu/**/*.{ts,tsx}": "pnpm run --filter random-menu type-check",
    "./packages/common-utils/**/*.{ts,tsx}": "pnpm run --filter common-utils type-check",
    "./packages/common-ui/**/*.{ts,tsx}": "pnpm run --filter common-ui type-check"
  }  
}

 

 

++ package.json 에 lint-staged 를 작성하는 대신, lint-staged.config.mjs 파일을 사용해 반복되는 타입체크 값을 함수로 만들 수 있다.

(lint-staged 설정파일 관련 문서: https://github.com/okonet/lint-staged#using-js-configuration-files)

// ./lint-staged.config.mjs
const MODULES = [
  { name: 'random-menu', parent: 'apps' },
  { name: 'common-utils', parent: 'packages' },
  { name: 'common-ui', parent: 'packages' },
]
const typeCheckConfigs = MODULES.reduce(
  (prev, { name, parent }) => ({
    ...prev,
    [`./${parent}/${name}/**/*.{ts,tsx}`]: () =>
      `pnpm run --filter ${name} type-check`,
  }),
  {},
)

export default {
  // linting
  '*.{ts,tsx}': 'eslint --cache --max-warnings=0',

  // formatting
  '*.{ts,tsx,css,md}': 'prettier --write',

  // type check
  ...typeCheckConfigs,
}

 

'레파지토리 구성하기' 카테고리의 다른 글

pnpm 패키지 관리자  (0) 2023.09.17
모노레포 - 터보레포  (0) 2023.09.17
모노리스 & 멀티레포 & 모노레포  (0) 2023.09.17
모노레포 - Yarn과 Lerna  (0) 2023.09.17
모노 레포 - yarn workspaces  (0) 2023.09.16