문제 상황은 다음과 같다.
특정 외부 패키지를 만들어서 거기에 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 링크가 생기지 않는다.
{
"scripts": {
"build": "tsc -p tsconfig.json"
}
}
build script 를 실행하면 내부적으로,
./node_modules/.bin/tsc
/usr/local/bin/tsc (전역)
PATH 환경변수에 지정된 다른 경로들...
이렇게 위로 타고 타고 올라가면서 typescript 를 찾게 되는데, 전이 의존성에 설치된 경우에는 상위 의존성까지 타고 올라가도 typescript 를 찾을 수 없어서 문제가 발생한 것이다.
repo/
├─ package.json ← 루트에 typescript 설치됨 ✅
├─ node_modules/
│ └─ typescript/ (설치된 패키지)
├─ apps/
├─ packages/
│ └─ design-system-react/
│ └─ tsconfig.json

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