하나의 repository 안에 하나의 프로젝트가 들어있는것을 의미한다.
일반적인 경우 대부분 multirepo를 사용한다.
package 별로 관리가 가능하기 때문에, 각 repository별 owner를 지정할 수 있다.
⇒ 패키지 관리가 수월해진다.
하나의 repository 별 하나의 CI를 구성 할 수 있어, 리소스가 적다.
⇒ CI의 Build 속도가 빠르다.
repository가 분리되어 있어, 각 패키지의 마스터 코드의 충돌을 방지 할 수 있다.
⇒ 서로 연관 관계가 없어 추가, 수정, 유지 관리의 유연성이 향상된다.
모든 공통된 설정과 모듈들을 반복적으로 설정, 설치해야 한다.
프로젝트 규모가 커짐에 따라 의존 그래프가 복잡해진다.
⇒ 버전 차이에 따라 종속성이 달라져 충돌이 발생 할 수 있다.
서로 분리 되어 있기 때문에 공통된 코드가 중복될 가능성이 커진다.
monorepo란, Monolithic Repositories의 약자로,
하나의 repository에서 여러개의 프로젝트가 구성된 것을 의미한다.
하나의 레포지토리 안에 여러개의 프로젝트가 구성되어 있기 때문에 편의성이 크다.
elint, Build, Unit Test 등 공통된 설정 과 node modules를 한번의 설치와 설정으로 사용 할 수 있다.
⇒ 업데이트 또한 한번에 가능한
하나의 Repository이기 때문에 패키지 간 공유가 수월하며 중복 코드를 쉽게 공통화 할 수 있다.
전체 Package의 의존 관계가 하나의 Repository에서 이루어지기 때문에 Package 간 의존성 관리가 수월해 진다.
분산되어 있던 모든 리소스를 하나의 repository에서 관리 하기 때문에, 규모가 커지게 되고 이로 인해 문제가 발생 할 수 있다.
Multi-Repo와 반대로 Repository가 하나로 되어 있기 때문에 CI가 하나로 구성된다는 장점이 있지만, Package가 규모가 커짐으로 인해 분산된 CI Build보다 속도가 느릴 수밖에 없다.
Package 간 의존성 관리가 쉽다는 장점이 있지만, 이로 인해 과도한 의존 관계가 나타날 수 있다.
개발 도구를 사용할 때 Package가 분산되어있다면 각각의 Package를 열어 사용하면 되지만 Mono-Repo의 경우는 하나의 개발 도구로 열 경우 해당 Package의 인덱싱 처리 속도가 길어진다.
1️⃣ 서로 다른 패키지가 연관 관계를 가질 경우
2️⃣ N 개의 패키지의 형태와 목적이 유사한 경우
3️⃣ N 개의 패키지 중 배포되어야 할 패키지의 비중이 큰 경우
yarn에서는 workspace 기능을 통해서 MonoRepo를 구성할 수 있다.
repository에서 다양한 packages를 구성하는 것을 도와주는 라이브러리이다.
프로젝트를 빌드하거나, 테스트 시 변경이 있는 패키지들을 배포할 때 도움을 준다.

호이스팅을 통해 다중 패키지에 사용되는 node modules를 최적화하여 중복되는 것을 최상위 경로로 재구축 한다.
공통 종속성을 최상위 수준에서만 설치한다.
lerna init
lerna init — independent
해당 프로젝트, 경로에 lerna repo를 만들거나 최신 버전으로 업데이트 할 때 사용한다.
— independent 옵션은 패키지들의 버저닝 정책을 독립으로 가져간다.
lerna version 1.0.1 # explicit
lerna version patch # semver keyword
lerna version # select from prompt(s)
이전 배포 버전에서 변경이 존재하는 package들의 버전을 변경해준다.
semver 키워드를 입력시키거나, 버전을 명시해주거나 선택해서 적용 할 수 있다.
lerna diff [package]
package의 지난 배포 이후 변경점에 대한 내용을 보여준다.
lerna bootstrap
각 패키지들의 의존을 설치하고, cross dependencies를 연결, 재정비 해준다.
의존이 있는 패키지의 경우 설치하는 대신 symlink를 정비한다.
# lerna run <script>
lerna run start
# lerna run -- scope <pacakge name> <script>
lerna run -- scope package-1 test
각 패키지들의 npm 명령어를 실행한다.
scope를 지정할 수 있으며, 지정하지 않으면 모든 패키지의 해당 명령어를 실행한다.
lerna publish
프로젝트에서 지난 릴리즈 이후 변경이 있었던 패키지를 배포한다.
lerna clean
각 패키지들의 node_modules 폴더를 삭제한다. (최상위 X)
https://medium.com/jung-han/lerna-로-모노레포-해보러나-34c8e008106a
https://kdydesign.github.io/2020/11/27/lerna-changelog/
https://velog.io/@sms8377/DevOps-MonoRepo란
https://kdydesign.github.io/2020/08/25/mono-repo-lerna/