하나의 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/