MonoRepo & Lerna

ㅎㅐ수·2020년 12월 26일
3

👩‍💻 Mono Repository?

협업을 나가서 초기셋팅을 우리가 한 게 아니고 초기세팅이 된 상태에서 클론을 받은 거라 프로젝트의 폴더 구성이 궁금해서 찾아보게 되었다!!

  • Monorepo는 여러 프로젝트의 소스 코드를 관리하는 데에 하나의 저장소(repository)만 사용하는 것을 의미한다.
    example) Monorepo를 이용하면 웹 앱 프로젝트, 모바일 앱 프로젝트, 서버 프로젝트가 한 저장소에 있게 됨!

👍 Mono Repository의 장점!

  • 통합적인 test, build, release 작업
    한 저장소에서 관리되기 때문에 한 번의 커맨드로 여러 패키지의 스크립트(test, build, release)를 실행할 수 있다.

  • 코드의 통일성 증가

  • 분산된 이슈의 통합
    대주제에 해당하는 하나의 저장소에서 이슈를 처리하기 때문에 여러 저장소에서 이슈를 올리면서 논의가 분산되는 것을 막을 수 있다.

  • 개별적 모듈 버전 관리
    Monorepo로 관리되어도 내부의 프로젝트들은 각각 개별적인 모듈이기 때문에 각각 버전 관리를 할 수 있다.

  • 쉬운 코드 공유
    이건 실제로 기업협업을 하면서 겪는 중,,, 이전에 했던 코드를 보며 이해하는 데 편리하다!

이러한 장점들 덕에, 현재 유명한 기업에서 많이 쓰이는 중이다...!!

🏢 규모가 큰 Mono-Repo의 대표적인 사례

  • Google

    초기 Google은 중앙 집중식 소스 제어 시스템을 통해 관리되는 공유 코드 베이스로 작업하기로 결정했다. 이 접근 방식은 16년 이상 Google에 좋은 서비스를 제공해 왔으며, 오늘날 Google의 소프트웨어 대부분이 Mono-Repo로 구성되어있다. 대표적인 예로 Google은 Bazel을 빌드 시스템으로 사용하며, Mono-Repo로 구성되어있다.
  • Facebook

    수십만 개의 파일에 대해 매주 수천 개의 커밋이 있는 Facebook의 기본 소스 저장소는 Linux 커널보다 훨씬 더 크다. 대표적으로 Buck 및 Scaling Mercurial이 있다.
  • Twitter

    Twitter에는 확장이 가능한 Mono-Repo Build System인 Pants를 제공하고 있다.

참고

🔜 Lerna?

  • lerna는 Git과 NPM을 사용하여 Mono-Repo 관리와 Workflow를 최적화는 도구이다.
  • lerna는 다중의 패키지가 있는 Monorepo 구조로 된 자바스크립트 프로젝트의 test, build, release 같은 작업을 최적화 시켜주는 툴
  • lerna는 위에 언급했던 것처럼 여러 저장소의 의존성을 묶어주는 역할과 각 패키지별 버전 업데이트를 도와준다.

Lerna를 사용한 프로젝트 구성


lerna.json 파일을 들어가보면 이렇게 생겼다.
참고블로그

Lerna의 특징

  • lerna의 특징은 Mono-Repo를 구성하고 배포하는 데 중점에 둔 기능으로 볼 수 있다.
  • 다중 패키지의 종속성 관리 및 모듈의 중복성 제거
    lerna를 사용하여 node module을 설치할 경우 자체적으로 패키지들의 모듈을 설치하며, 그 과정에서 종속성을 관리하여 중복된 모듈을 하나로 통합한다.

  • 다중 패키지의 단일 버전 및 독립적 버전 관리
    Mono-Repo의 구성을 따르면 여러 개의 Package로 구성된다. 이런 Package는 어떤 상황에서 하나의 버전 정책을 가져갈 수 있지만, 또 어떤 경우에는 서로 독립적인 버전 정책을 가져가야 하는 경우가 있는데 lerna는 이러한 기능을 지원하여 버전 정책을 정할 수 있다.

  • 변경된 패키지를 일괄적으로 GIt Remote Repository에 Push
    여러 Package가 수정되었다면 Package 별로 Git Remote Repository에 commit과 push를 할 필요가 없다. lerna를 사용하면 단 한 번의 commit과 push로 Remote Repository에 반영할 수 있다.

  • 변경된 패키지를 일괄적으로 NPM Repository에 Publish
    NPM Repository에 node module을 배포하기 위해서 publish 명령을 사용한다. Mono-Repo에서 각 Package를 NPM Repository에 배포하기 위해서 하나하나 publish를 입력할 필요가 없다. 단 한 번의 publish로 변경 사항이 있는 Package만 배포가 될 것이다.

Yarn Workspace

  • Yarn은 유일하게 Mono-Repo 기능을 지원하고 Yarn Workspace의 목적은 Mono-Repo의 Workflow를 용이하게 하는 것이다.
  • Yarn Workspace를 통해 각 패키지는 서로 참조하는 연관 관계를 가질 수 있다.
  • NPM은 Version 7부터 worksapce 개념이 제공될 예정이라고 한다.

1개의 댓글

comment-user-thumbnail
2020년 12월 27일

오 혜수님 대박 ReactNative랑 React에서 만든 소스 코드를 한 곳에서 관리할 수 있는거죠?? 다음 프로젝트에 도전 :)

답글 달기