Skip to content

.yarn cache 폴더

SeongYeon edited this page Nov 7, 2024 · 1 revision

.yarn/cache 폴더의 유무

yarn berry의 pnp 방식을 사용하면 라이브러리를 설치했을 때, .yarn/cache 경로에 라이브러리 압축 파일이 생성된다.

그런데, 현재 우리 프로젝트에는 라이브러리를 설치해도 cache 폴더가 생성되지 않는 현상을 발견했다.

그 이유는 다음과 같다.

image

글로벌캐시 옵션이 기본값인 true로 되어 있기 때문에 특정 작업 폴더에 cache 파일이

생성되지 않았던 것이다.

그렇다면 어디에 설치되었던 것일까 ?

image

위의 경로에 설치되어 있었다. 들어가보자

image

그렇다. 프로젝트 루트 디렉토리에 설치되어 있는 게 아니라 로컬 pc 어느 공간에 cache 파일들이

설치되었다.

이렇게 되어도 괜찮은가 ?

정답은 된다.

그 이유는 현재 우리는 zero-install 방식을 사용하지 않는다. 따라서, cache 파일을 github에 공유할

필요가 없다. 어차피 pull 받으면 새로 설치된 라이브러리는 yarn install 명령어로 설치해야 된다.

따라서 cache 파일이 프로젝트 루트 디렉토리에 설치 되든, 각자 pc 어느 전역공간에 설치 되든

아무런 상관이 없다.

참고로 라이브러리를 설치하면 .yarm-lock 파일에 의존성 버전이 기록된다. 그리고 yarn install

명령어를 입력하면 .yarm-lock 파일을 참고하여 라이브러리를 압축 파일로 설치되는 시스템이다.

image

react-router-dom 라이브러리를 설치하니 yarm-lock 파일에 의존성 버전이 기록되었다.

나중에 누군가 pull 받고 install 하면 해당 의존성 버전을 보고 cache 파일을 설치하는 시스템이다.

글로벌 캐시의 경우 프로젝트 폴더 구분

  • 글로벌 캐시의 경우 위와 같이 ./yarn/cache 폴더의 위치가 사용자의 루트에 생기게 된다
  • 그렇다면 yarn berry 로 세팅한 모든 프로젝트가 하나의 ./yarn/cache 파일을 공유하게 될 것인데 어떻게 프로젝트 별 라이브러리 의존을 관리할 수 있는지 궁금해졌다.

구분 방법

  • yarn berry는 내부적으로 각 패키지의 정확한 버전과 해시값을 사용하여 의존성을 관리한다
  • 여러 프로젝트가 글로벌 캐시를 공유하더라도 각각의 의존성은 다음과 같이 관리된다
프로젝트별 .yarn/
├── .pnp.cjs           #  프로젝트의 의존성 매핑 정보
├── .pnp.loader.mjs    # PnP 로더
└── releases/          # yarn 자체 릴리스
  • 각 프로젝트의 의존성은 .pnp.cjs 파일에서 관리되며, 이 파일은
    • 패키지 이름
    • 정확한 버전
    • 체크섬(해시)
    • 위치 정보를 포함한다
project1/
├── .yarn/
   └── .pnp.cjs      # react@17.0.2, lodash@4.17.21 매핑
└── package.json

project2/
├── .yarn/
   └── .pnp.cjs      # react@18.0.0, axios@0.24.0 매핑
└── package.json

~/.yarn/berry/cache/  # 글로벌 캐시
├── react-17.0.2-[hash].zip
├── react-18.0.0-[hash].zip
├── lodash-4.17.21-[hash].zip
└── axios-0.24.0-[hash].zip

의존성 해결 과정

// .pnp.cjs 예시 (단순화됨)
{
  "[email protected]": {
    "hash": "a1b2c3...",
    "location": "/.yarn/cache/react-17.0.2-[hash].zip"
  },
  "[email protected]": {
    "hash": "x1y2z3...",
    "location": "/.yarn/cache/react-18.0.0-[hash].zip"
  }
}
  • 각 패키지는 버전과 해시로 고유하게 식별
  • 동일한 패키지의 다른 버전은 별도로 저장
  • 의존성 충돌 방지

실제 동작 방식

# project1에서
yarn add react@17.0.2
#  .pnp.cjs에 react 17.0.2 매핑 추가
#  글로벌 캐시에 저장 (없는 경우)

# project2에서
yarn add react@18.0.0
#  .pnp.cjs에 react 18.0.0 매핑 추가
#  글로벌 캐시에 저장 (없는 경우)

💻 개발 일지

💻 공통

💻 FE

💻 BE

🙋‍♂️ 소개

📒 문서

☀️ 데일리 스크럼

🤝🏼 회의록

Clone this wiki locally