yarn berry 에서 내 라이브러리가 @types 정의를 가져오지 못하는 이유

김성현·2022년 8월 2일
0

많은 예시에서 @types/* 패키지를 다음과 같이 설치한다.

  • npm i -D @types/???
  • yarn add -D @types/???
  • pnpm add -D @types/???

모두 -D라는 개발 전용 의존성 옵션을 줘서 실제 개발 버전에 @types/* 패키지가 불필요하게 들어가는 것을 막는다.

그런데 yarn berry를 사용하던 중 의아한 현상을 발견했다

위 코드는 postgres와 kafka 트랜잭션을 한번에 커밋시켜주는 코드를 작성하던 중 발견한 현상으로 txPg는 원래 pg패키지의 타입 정의인 @types/pg에서 온 pg.PoolClient 이다.

그런데 보다시피 타입 자체는 제대로 추론했는데 auto completion은 제대로 안되는 증상을 발견했다.

이를 해결하기 위해 yarn berry에서 접근을 제어하는 .pnp.cjs를 살펴보던 중 원인으로 추정되는 코드를 발견했고 그 내용은 다음과 같았다.

보다시피 yarn berry는 pnp를 위해 zip을 사용하기에 실제 경로가 아닌 가상의 경로인 virtual:어쩌고저쩌고를 이용한다.

그런데 여기에서 devDep로 설정된 @types/pg가 존재하지 않는다는 사실을 발견하고 혹시? tsc가 여기를 참조하는 건가? 하고 의심이 들어서 다른 예시를 확인해 봤다.


여기서 txKafkakafkajs를 사용하는데 이 패키지는 types정의가 내장되어 있다.

따라서 나는 @types/pgdevDep로 설정되어 yarn berry가 참조 가능함을 거부하는 것이 원인이라 생각해 @types/pg를 그냥 일반 의존성으로 변경하고 다시 동일한 작업을 수행해 보니 결과는 다음과 같았다.

package.json

.pnp.cjs

vscode

예상대로.pnp.cjs의 packageDependencies에 @types 정의가 추가되었고 이후에는 vscode 에 정상적으로 타입 정의가 나오는 것을 확인하였다.

다만 그냥 dep에 추가하면 yarn berry가 아닌 다른 패키지 관리자에서는 의미가 적을 수도 있으므로 optionalDependencies@types/pg를 추가하였고 그 결과 역시도 동일하였다.


노드와 npm 생태계를 경험하며 수없이 많은 에러를 발견했는데...

슬프게도 대부분은 코드 문제가 아닌

  • @types 패키지 참조 불가능으로 인한 타입 정의 에러
  • node_modules의 유령 참조 문제
  • monorepo에서 node_modules의 symlink로 인한 ts2742, 패키지가. portable하지 않음 문제

그외 등등, 대다수는 npm 생태계 자체에서 생기는 문제가 많았다.

다행이도 yarn berry는 지금까지 내가 본 npm 생태계 중에서는 이런 문제를 잘 해결했다.

하지만 여전히 @types패키지와 npm 환경은 나를 고통스럽게 한다.

왜 node 개발자가 deno를 처음부터 다시 개발했는지 이해가 간다.

노드 생태계는 쓰면서 계속 느끼지만 뭔가가... 뭔가가 문제가 많다...

profile
수준 높은 기술 포스트를 위해서 노력중...

0개의 댓글