본문 바로가기
web/기타

npm에서 yarn berry로

by fien 2022. 11. 9.

Migration to yarn berry

최근에 팀원이 yarn berry를 도입하자고 해서 마이그레이션을 시작했습니다. 빌드 시간을 단축할 수 있고 다른 회사들도 사용한다하여 좋나보다 하고 지나갔습니다. 그러한 무지 상태에서 작업을 하니 도중에 문제가 발생했습니다. 프로젝트 코드에서 의존성 명시 없이 라이브러리를 사용하고 있었는데 yarn berry로 마이그레이션을 하고 빌드를 하니 의존하지 않는 패키지에 접근하고 있다는 오류가 뜬 것 입니다.

아래에서 정리하겠지만 기존 npm 프로젝트에서는 유령 의존성에 의해 특정 패키지가 접근이 가능합니다. yarn berry로 넘어오니 접근이 안되는 게 불편하게 느껴졌습니다. 또한 마이그레이션 작업을 할 때 명시 하지 않은 패키지를 자동으로 추가해주는 방법이 없는지 궁금했고 그래서 yarn berry에 대해 공부를 시작했습니다.

찾아보니 이러한 생각이 완전히 착오적 발상임을 알게 되었습니다. yarn berry는 의존성을 정확하게 명시하고 관리하는 것이 목적인데 그 반대로 생각하고 있던 것입니다.

 

마이그레이션은 공식 문서를 참고하세요

migration https://yarnpkg.com/getting-started/migration

 

아래는 토스의 글을 요약한 것으로 원문을 꼭 읽으시길 추천합니다.

https://toss.tech/article/node-modules-and-yarn-berry

node_modules의 문제점과 yarn berry

npm은 의존성을 파일 시스템으로 관리합니다. 패키지를 찾기 위해 상위 디렉토리의 node_modules를 순차적으로 탐색합니다. 패키지를 찾기 위해 반복적으로 readdir, stat 같은 느린 I/O 동작이 발생합니다. 또한, 상위 디렉토리의 환경에 따라 패키지를 찾지 못할 수도 다른 버전의 패키지를 불러올 수 있어 환경에 따라 다르게 동작할 위험이 있습니다.

 

npm과 yarn v1은 트리 구조의 node_modules에 의해 패키지 설치가 중복되는 것을 막기 위해 호이스팅 기법을 사용합니다.

호이스팅을 통해 직접 의존하고 있지 않은 패키지 B(1.0)을 사용할 수 있게 됩니다. 이러한 현상을 유령 의존성(Phantom Dependency)이라고 부릅니다. 즉, package.json에 명시하지 않은 라이브러리를 사용할 수 있게 됩니다. 이러한 의존성은 다른 의존성을 제거 했을 때 같이 사라지기 때문에 의존성 관리를 어렵게 만듭니다.

 

yarn berry는 이러한 문제를 Plug’n’Play 전략을 통해 해결합니다.

 

*yarn berry는 기존 node.js 의존성 관리 시스템과 다르기 때문에 패키지 단위로만 적용할 수 있습니다.

 

yarn install 명령어를 통해 의존성을 설치를 하면 node_modules가 아닌 .yarn/cache 폴더에 zip 파일로 의존성을 저장합니다. 그리고 의존성에 접근하는 경로는 .pnp.cjs 파일에 저장됩니다. 이 정보를 이용하면 디스크의 I/O 없이 어떤 패키지가 어떤 라이브러리에 의존하는지, 각 라이브러리는 어디에 위치하는지 바로 알 수 있습니다.

결과적으로 yarn berry를 도입하면 다음과 같은 장점이 있습니다.

  • node_modules 디렉토리를 생성하지 않기 때문에 빠르게 설치 할 수 있습니다.
  • 패키지를 중복으로 설치하지 않기 때문에 스토리지 용량을 아낄 수 있습니다.
  • 의존성을 zip파일로 관리하기 때문에 없거나 변경된 의존성을 쉽게 감지할 수 있습니다.
  • .pnp.cjs로 의존성의 위치를 알고 있기때문에 탐색 시간이 줄어들고 외부 환경에 영향을 받지 않고 의존성 관리를 엄격하게 할 수 있습니다.

Zero-install

yarn berry를 사용하면 의존성을 zip 파일로 관리하기 때문에 용량이 훨씬 작고 의존성이 단일 파일로 표현되기 때문에 파일의 수도 훨씬 적습니다. 그렇기 때문에 의존성 또한 Git으로 관리할 수 있는데 이를 zero-install 이라고 합니다. zero-install을 하면 의존성 파일이 포함되어 있기 때문에 의존성을 새롭게 설치할 필요가 없고 CI에서 의존성 설치하는 시간을 크게 절약할 수 있습니다.

댓글