mono-repo와 lerna

죠현졍·2022년 6월 30일
1

TIL

목록 보기
2/6

multi-repo (poly-repo)

하나의 repository 안에 하나의 프로젝트가 들어있는것을 의미한다.

일반적인 경우 대부분 multirepo를 사용한다.

👍 장점

1️⃣ repository 별 owner를 지정 할 수 있다.

package 별로 관리가 가능하기 때문에, 각 repository별 owner를 지정할 수 있다.

패키지 관리가 수월해진다.

2️⃣ CI Build가 빠르다.

하나의 repository 별 하나의 CI를 구성 할 수 있어, 리소스가 적다.

⇒ CI의 Build 속도가 빠르다.

3️⃣ 패키지의 명확한 분리를 통해 유연성을 향상 시킬 수 있다.

repository가 분리되어 있어, 각 패키지의 마스터 코드의 충돌을 방지 할 수 있다.

⇒ 서로 연관 관계가 없어 추가, 수정, 유지 관리의 유연성이 향상된다.

👎 단점

1️⃣ 중복된 설정과 반복된 설치가 존재한다.

모든 공통된 설정과 모듈들을 반복적으로 설정, 설치해야 한다.

  • Example eslint, babel 설치 및 설정 파일을 동일하게 구성해야함

2️⃣ Dependency가 복잡하다.

프로젝트 규모가 커짐에 따라 의존 그래프가 복잡해진다.

⇒ 버전 차이에 따라 종속성이 달라져 충돌이 발생 할 수 있다.

3️⃣ 중복 코드가 있을 수 있다.

서로 분리 되어 있기 때문에 공통된 코드가 중복될 가능성이 커진다.


mono-repo

monorepo란, Monolithic Repositories의 약자로,

하나의 repository에서 여러개의 프로젝트가 구성된 것을 의미한다.

👍 장점

1️⃣ 하나의 레포지토리로 여러개의 프로젝트를 관리 할 수 있다.

하나의 레포지토리 안에 여러개의 프로젝트가 구성되어 있기 때문에 편의성이 크다.

elint, Build, Unit Test 등 공통된 설정 과 node modules를 한번의 설치와 설정으로 사용 할 수 있다.

⇒ 업데이트 또한 한번에 가능한

2️⃣ 중첩되는 코드를 공통화 할 수 있다.

하나의 Repository이기 때문에 패키지 간 공유가 수월하며 중복 코드를 쉽게 공통화 할 수 있다.

3️⃣ 효율적인 의존성 관리가 가능하다.

전체 Package의 의존 관계가 하나의 Repository에서 이루어지기 때문에 Package 간 의존성 관리가 수월해 진다.

👎 단점

1️⃣ repository의 규모가 커진다.

분산되어 있던 모든 리소스를 하나의 repository에서 관리 하기 때문에, 규모가 커지게 되고 이로 인해 문제가 발생 할 수 있다.

2️⃣ CI Build가 느리다.

Multi-Repo와 반대로 Repository가 하나로 되어 있기 때문에 CI가 하나로 구성된다는 장점이 있지만, Package가 규모가 커짐으로 인해 분산된 CI Build보다 속도가 느릴 수밖에 없다.

3️⃣ 과도한 의존 관계

Package 간 의존성 관리가 쉽다는 장점이 있지만, 이로 인해 과도한 의존 관계가 나타날 수 있다.

4️⃣ Dev Tools의 인덱싱 저하

개발 도구를 사용할 때 Package가 분산되어있다면 각각의 Package를 열어 사용하면 되지만 Mono-Repo의 경우는 하나의 개발 도구로 열 경우 해당 Package의 인덱싱 처리 속도가 길어진다.

mono-repo를 사용하면 좋은 경우

1️⃣ 서로 다른 패키지가 연관 관계를 가질 경우
2️⃣ N 개의 패키지의 형태와 목적이 유사한 경우
3️⃣ N 개의 패키지 중 배포되어야 할 패키지의 비중이 큰 경우

MonoRepo를 구성하는 방법

1️⃣ yarn workspace

yarn에서는 workspace 기능을 통해서 MonoRepo를 구성할 수 있다.

2️⃣ Lerna

repository에서 다양한 packages를 구성하는 것을 도와주는 라이브러리이다.

프로젝트를 빌드하거나, 테스트 시 변경이 있는 패키지들을 배포할 때 도움을 준다.

🧱 구조

호이스팅을 통해 다중 패키지에 사용되는 node modules를 최적화하여 중복되는 것을 최상위 경로로 재구축 한다.

공통 종속성을 최상위 수준에서만 설치한다.

📣 주요 명령어

  1. lerna init
lerna init
lerna init — independent

해당 프로젝트, 경로에 lerna repo를 만들거나 최신 버전으로 업데이트 할 때 사용한다.

— independent 옵션은 패키지들의 버저닝 정책을 독립으로 가져간다.

  1. lerna version
lerna version 1.0.1 # explicit
lerna version patch # semver keyword
lerna version # select from prompt(s)

이전 배포 버전에서 변경이 존재하는 package들의 버전을 변경해준다.

semver 키워드를 입력시키거나, 버전을 명시해주거나 선택해서 적용 할 수 있다.

  1. lerna diff
lerna diff [package]

package의 지난 배포 이후 변경점에 대한 내용을 보여준다.

  1. lerna bootstrap
lerna bootstrap

각 패키지들의 의존을 설치하고, cross dependencies를 연결, 재정비 해준다.

의존이 있는 패키지의 경우 설치하는 대신 symlink를 정비한다.

  1. lerna run
# lerna run <script>
lerna run start

# lerna run -- scope <pacakge name> <script>
lerna run -- scope package-1 test

각 패키지들의 npm 명령어를 실행한다.

scope를 지정할 수 있으며, 지정하지 않으면 모든 패키지의 해당 명령어를 실행한다.

  1. lerna publish
lerna publish

프로젝트에서 지난 릴리즈 이후 변경이 있었던 패키지를 배포한다.

  1. lerna clean
lerna clean

각 패키지들의 node_modules 폴더를 삭제한다. (최상위 X)


📚 Reference

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/

0개의 댓글