부트캠프 마지막 프로젝트를 진행하며 패키지 매니저를 yarn으로 결정했었다.
써보지 않아서 궁금하기도 했고 병렬설치때문에 패키지 설치속도가 npm보다 빠르다하여 사용했었음.
아주 초창기에 멘토님과 얘기하던중 yarn berry를 써보는 게 어떠냐는 제안을 받았다.
당시에 블로그에 적혀있는 글들을 보며 끄덕끄덕 하곤 바로 마이그레이션을 했다.
우왕좌왕 했지만, 공식문서를 보며 어찌저찌 해냄!
...이후 문제가 발생했었다. 그리하여 zero install을 포기한 채 yarn berry를 사용했었다.
한달 반이 지난 지금, zero install에 성공!
한번 뭐가 문제였고 어떻게 하면 되는지 알아보자.
공식문서와 여러 문서를 읽으며 찬찬히 알아낸 zero install에 대해 설명해 보겠다.
즉, 필요 없는 경로 탐색을 매번 진행한다. 탐색 자체는 I/O작업이다. 따라서 메모리보다 속도가 현저히 느려 최적화가 어렵다.
왼쪽 종속성 트리를 살펴보면 중복으로 의존하는 패키지가 존재한다. 이를 해결하기위해 hosting, merge를 진행한다.
그러면 탐색 시간을 줄일 수 있다. 다만 반대급부로 존재하지 않는 종속성에 의존하는 코드가 발생할 수 있다.
이를 유령 의존성이라고 한다.
yarnberry는 호이스팅, 병합하지 않는다.
또한 node_modules를 사용하지도 않는다. 대신 ./yarn
폴더 하위에 의존성을 zip포맷으로 저장해놓는다. 이 경로를 탐색하기위한 정보파일인 pnp.cjs
도 생성한다.
이를 통하여 유령 의존성 문제와 I/O => 메모리문제를 해결하였다.
여기서 yarnberry는 멈추지 않고 ./yarn
폴더(의존파일) 자체를 커밋에 포함시켜 git에 올려놓는다.
이렇게 되면, 설치를 하지않고도 같은 환경에서 실행할 것 을 보장할 수 있다.
위 내용이 전부고 핵심이다.
우리 프로젝트에서 사용했던 yarn의 버전은 4.1.0이었고 globalCache가 true였다. (다른버전도 true인지 모름ㅎㅎ)
이게 무슨말이냐면, 캐시가 ..사용자계정/appdata/local/yarn/cache
폴더(사용자 컴퓨터 로컬 내부...)에 저장되었단 뜻이다.
따라서 한달 반 전에 경로문제가 발생하였던 것이다.
해결법은 간단하다.
# yarnrc.yml
cacheFolder: ./.yarn/cache
enableGlobalCache: false
nodeLinker: pnp
위처럼 globalCache설정을 제거해주고 로컬 캐시를 사용하겠다고 경로를 같이 명시하면 된다.
항상 공식문서를 잘읽어 보자.
아래는 zero install을 도입하며 겪은 트러블 슈팅이다.
yarn dlx @yarnpkg/sdks
로 설치해도 발생했음.
yarn dlx @yarnpkg/sdks
로설치한 ts, eslint버전과 현재 프로젝트에 설치된 버전이 달라서 적용이 안되는 에러.
=> typescript버전을 5.3.3 => 5.4.3, type/nodes
버전, yarn
버전을 업데이트하여 해결
CI시 발생한 에러.
로컬 운영체제+CPU아키텍처과 CI환경의 운영체제+CPU 아키텍처가 달라서 생기는 문제.
공식문서에 yarnrc.yml
로 옵션 주는 방법이 있음.
참고로 프로젝트 CI환경은 linux+x64
다.
# yarnrc.yml
supportedArchitectures:
{
os: ['current', 'linux'],
# 지금 생각해보면 윈도우도 x64아닌가...?
cpu: ['current', 'x64'],
libc: ['current', 'glibc', 'musl'],
}
이렇게 옵션 주고나서 yarn cache clean --all
로 캐시전부 삭제후 yarn install
하면 다른 운영체제+cpu버전도 설치 완료
바로 윗 문제를 해결하고나서 발생한 이슈...😭
CI환경은 linux+x64라 win32+x64로 설치한 캐시파일이 필요없어서 삭제하여 최적화 하고싶지만, 삭제하면 캐시가 변경된다는 소리.
CI환경에서 의존성 설치시 --immutable-cache
옵션을 주어서 캐시가 변경되면 종료되게 만들었으나, 임시 방편으로 옵션을 제거하여 해결.
=> 더 좋은 해결법을 찾아보자.
꽤나 유의미한 차이지만, 몇 번 해봐야 평균을 낼 수 있을 것 같다.
대략 20~30% 가량 빨라진듯?!
급할땐 구글링해서 적용하는 것도 좋지만 시간적 여유가 있을때 bottom-up방식으로 기술부채를 해결하는 쾌감이 있다!