Lerna와 Workspaces, MonoRepo

hyeseon han·2022년 4월 21일
0

🚩 MonoRepo

여러개의 관계가 있는 프로젝트, 패키지를 단일 저장소(repository)로 관리하는 방식

  • 여러 패키지에 eslint,prettier 등 하나의 설정을 공유할 수 있다.
  • 코드를 패키지로 모듈화하여 재사용할 수 있다.

Monorepo tools

모노레포 관리 도구

  • Bazel
  • Gradle
  • Lage
  • Lerna
  • Nx
  • Rush
  • Turborepo

🚩 Lerna

단일 저장소에서 다양한 패키지 구성을 도와주는 라이브러리이다. 각 패키지들을 배포하고 버전을 관리한다.

lerna로 패키지 간의 의존성을 관리할 수 있지만, 이슈가 발생하기 대문에 yarn workspaces에게 맡긴다.

  • 주요 명령어
    $ lerna publish : 업데이트된 패키지를 게시
    $ lerna bootstrap : repo의 dependencies 연결
    $ lerna clean : node_modules 삭제(root의 node_moduless는 삭제되지않음)

  • 고정 모드(기본값)
    -package들이 모두 단일 버전 라인으로 작동
    -버전은 프로젝트 root의 lerna.json에 버전으로 관리된다.
    -lerna publish한 경우, 하위 package의 모듈이 변경사항이 있을 경우 전체 새 버전으로 업데이트 된다.

  • 독립 모드(independent)
    -각각의 package들의 버전을 서로 독립적으로 관리할 수 있다.
    -lerna publish한 경우, 각각 변경된 package의 버전을 지정할 수 있다.

// 전역으로 설치
$ npm install -g lerna

// 독립(independent) 모드
$ leran init --independent
// lerna.json

{
  "packages": [		// 사용자 패키지들을 정의할 폴더 위치 설정 옵션
    "packages/*",
    "apps/*"
  ],
  "version": "independent",	
  "npmClient": "yarn",			// 명령을 실행할 특정 클라이언트를 지정하는 옵션
  "useWorkspaces": true,		// yarn workspace 사용을 위해 useWorkspaces를 true로 한다.
  "command": {					// 발행
    "publish": {				// 옵션
      "conventionalCommits": true,			
      "message": "chore(release): publish",			// 공개 버전 업데이트를 수행 할 때 사용자의 커밋 메세지 등록 옵션
      "registry": "https://npm.pkg.github.com",		// 발행된 프로젝트를 npmjs.org 또는 다른 곳에서 게시 시에 URL 설정하는 옵션
      "allowBranch": "main"
    }
  }
}
// root package.json

{
  "name": "*****",
  "private": true,		// true로 함으로써 Rootrk npm repository로 배포되는 것을 막아준다.
  "workspaces": [		// lerna.json의 packages의 경로와 일치
    "packages/*",
    "apps/*"
  ],
  "scripts": {
						...
  },
  "devDependencies": {
						...
  },
  "dependencies": {
 						...
  },
  "version": "1.0.1"
}

🚩 Workspaces

package 매니저로써 monorepo 내 multi-package에 대한 의존성 관리를 도와준다.

yarn workspaces 만으로 관리하지 않는 이유는 여러개의 패키지를 쉽게 관리할 수 있는 CLI 명령어들이 lerna에서 많이 제공되기 때문이다.

// 패키지A에 패키지B를 추가
$ yarn workspace <@패키지A> add <@패키지B>

lerna는 monorepo로 구성된 프로젝트 전체를 관리하고 각 패지키들을 배포하고 버전 관리하고, yarn은 각 패키지들간의 의존성을 관리한다.

0개의 댓글