[TIL] 2025.10.12

오다혜·2025년 10월 12일

문제상황

문제 상황은 다음과 같다.

특정 외부 패키지를 만들어서 거기에 typescript 를 설치하고,
해당 외부 패키지를 의존성으로 가지는 프로젝트에서 tsc 스크립트를 실행했는데
tsc 스크립트를 사용할 수 없다고 나옴

typescript 를 각 프로젝트에 설치하면 버전을 하나로 관리하는 것이 어려워서 패키지로 빼고 싶었다.


과정

GPT 피셜,

tsc는 “직접 의존성”의 bin만 소비자 프로젝트의 node_modules/.bin에 링크됩니다. 외부 패키지의 “하위(전이) 의존성”으로 깔린 TypeScript의 tsc는 기본적으로 노출되지 않기 때문에, 소비자 프로젝트에서 tsc가 없다고 나옵니다.

→ pnpm 의 특성과 관계가 있었다.

npm/pnpm은 직접 의존성의 bin만 현재 프로젝트의 node_modules/.bin에 심볼릭 링크로 추가하고, 전이 의존성의 bin은 노출하지 않는다. 그래서 A(외부 패키지) → typescript 구조에서, A만 내 프로젝트에 달려 있고 typescript가 전이 의존성이라면 tsc 링크가 생기지 않는다.

tsc 동작 과정

{
  "scripts": {
    "build": "tsc -p tsconfig.json"
  }
}

build script 를 실행하면 내부적으로,

./node_modules/.bin/tsc
/usr/local/bin/tsc (전역)
PATH 환경변수에 지정된 다른 경로들...

이렇게 위로 타고 타고 올라가면서 typescript 를 찾게 되는데, 전이 의존성에 설치된 경우에는 상위 의존성까지 타고 올라가도 typescript 를 찾을 수 없어서 문제가 발생한 것이다.


결론

  • typescript 는 각 프로젝트마다 설치하는 것이 정신건강에 좋다.
  • 버전을 하나로 관리하는 다른 방법을 고안해보자.
    - 하나로 맞추고 싶으면 더 상위에 typescript 를 설치해서 다같이 사용하도록 만들어보자.
repo/
 ├─ package.json  ← 루트에 typescript 설치됨 ✅
 ├─ node_modules/
 │   └─ typescript/ (설치된 패키지)
 ├─ apps/
 ├─ packages/
 │   └─ design-system-react/
 │       └─ tsconfig.json

상위에 설치하고 내부 패키지에서는 typescript 를 삭제했더니 원하는 대로 동작한다.

profile
프론트엔드에 백엔드 한 스푼 🥄

0개의 댓글