여러개의 관계가 있는 프로젝트, 패키지를 단일 저장소(repository)로 관리하는 방식
eslint
,prettier
등 하나의 설정을 공유할 수 있다.모노레포 관리 도구
단일 저장소에서 다양한 패키지 구성을 도와주는 라이브러리이다. 각 패키지들을 배포하고 버전을 관리한다.
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"
}
package 매니저로써 monorepo 내 multi-package에 대한 의존성 관리를 도와준다.
yarn workspaces 만으로 관리하지 않는 이유는 여러개의 패키지를 쉽게 관리할 수 있는 CLI 명령어들이 lerna에서 많이 제공되기 때문이다.
// 패키지A에 패키지B를 추가
$ yarn workspace <@패키지A> add <@패키지B>
lerna는 monorepo로 구성된 프로젝트 전체를 관리하고 각 패지키들을 배포하고 버전 관리하고, yarn은 각 패키지들간의 의존성을 관리한다.