티스토리 뷰

공부일지(TIL)/Web

Yarn workspaces

Alledy 2021. 7. 28. 17:57

많은 자바스크립트 프로젝트들이 모노레포로 운영되고 있다. 모노레포는 여러 프로젝트들을 한 군데 저장함으로써 코드 consistency를 쉽게 유지하도록 해준다. 예를 들어 각자 다른 프로젝트 A, B가 각자 다른 레포에 저장되어 있고 B가 A에 디펜던시가 있는 상황을 가정해보자. A의 코드가 업데이트된다면 B에서 사용되고 있는 A는 어떻게 될까? 업데이트된 A의 코드가 리모트 환경에 업데이트가 되지 않았거나, 올라와 있다고 하더라도 B에서 이 최신 코드를 Pull해오지 않는다면 AB에서 쓰이는 A 사이의 싱크가 맞지 않게 된다.

모노레포를 사용하여 A와 B를 같은 코드베이스에서 사용하게 된다면 이런 문제를 해결할 수 있다. 다만 모노레포의 단점은 그 만큼 빌드 시간이 오래 걸릴 수 있고(예를 들어 B를 빌드할 때 디펜던시가 있는 A도 함께 빌드해야 한다) 의존성 관리를 잘해줘야 한다는 점이다.

그래서 모노레포에서 멀티 패키지를 관리해주는 툴로 lerna를 많이 사용하는 것 같다. 다만 lerna의 단점은 모든 패키지들마다 npm/yarn install 을 한 다음 심링크를 만들어주는 방식이라 노드 모듈 안에 중복이 많이 생긴다고 한다.(A wrapper like Lerna would first run yarn install for each package.json separately and then run yarn link for packages that depend on each other. As you see, there is a redundancy of third-party dependencies.) 그래서 hoist 옵션을 줄 수 있게 되어 있는데, hoist는 패키지 간 공통된 의존성을 모노레포의 root에서 관리하도록 패키지들 바깥으로 빼주는 것이다. 그래서 패키지마다 중복 설치하지 않고 root에서 이런 것들은 한 번 설치하고 하위 패키지들에서는 심링크로 참조하도록 하는 방법이다.

이것과 비슷한 기능을 지원하는 것이 yarn의 workspace다. yarn의 workspace 또한 root에 공통되는 의존성을 관리하여 빌드 시간을 빠르게 하는데, lerna와 다른 점은 yarn은 install을 한 번만 실행한다. 모노레포 어디에서 yarn install 하더라도 workspaces를 포함하는 똑같은 결과를 만들어낸다. (With Workspaces enabled, Yarn can produce a much more optimized dependency structure and when you run the usual yarn install anywhere in the project you’ll get the following node_modules.)

그리고 lerna는 hoist 옵션을 사용하더라도 다른 버전의 똑같은 패키지가 존재할 때, 가장 많이 쓰이는 버전의 패키지를 hoist하는데 yarn은 같은 패키지라도 버전이 다르면 hoist하지 않는다.

Ref

'공부일지(TIL) > Web' 카테고리의 다른 글

Static Rendering vs Server Side Rendering  (0) 2021.11.15
package.json의 resolutions  (0) 2021.10.14
스크립트 로딩 (async, defer)  (0) 2021.07.20
Window vs Document  (0) 2021.07.20
쿠키  (0) 2021.03.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함