Open gloriaJun opened 3 years ago
lerna를 이용한 모노레포 개발 환경 구성하기
lerna v3.22.1
npm i -g lerna lerna init
위의 명령을 실행하면 해당 프로젝트 루트 폴더를 기준으로 아래와 같이 파일이 구성된다
├── lerna.json ├── package.json └── packages 1 directory, 2 files
lerna.json
packages
package.json
{ "version": "0.0.0", "packages": ["packages/*"], "npmClient": "yarn", "useWorkspaces": true }
version: "independent"로 정의하면 각 패키지의 버전을 독립적으로 가져갈 수 있다.
version: "independent"
{ "name": "foo", "private": true, "scripts": { "postinstall": "lerna bootstrap", }, "devDependencies": { "lerna": "^3.22.1" }, "workspaces": { "packages": [ "packages/*" ] } }
<root_dir>/pakcages 하위에 각 패키지 모듈 프로젝트를 생성한다.
<root_dir>/pakcages
├── lerna.json ├── package.json └── packages ├── module-1 │ └── package.json └── module-2 └── package.json
https://github.com/lerna/lerna/tree/master/commands/bootstrap 해당 명령을 수행하면 ignore 로 설정된 package 를 제외한 모든 package 의 npm install 을 실행한다. 의존이 있는 패키지는 설치 대신 Symlink를 정비 합니다.
각 패키지에 설치된 모듈들이 루트로 끌어올려진다
https://github.com/lerna/lerna/tree/master/commands/clean 루트 경로의 node_modules를 제외하고, 각 패키지들의 node_modules을 삭제한다.
해당 명령어를 이용하여 아래와 같이 정의된 스캐폴딩 구조를 갖춘 package를 생성할 수 있다.
❯ tree packages/foo packages/foo ├── README.md ├── __tests__ │ └── foo.test.js ├── lib │ └── foo.js └── package.json 2 directories, 4 files
https://github.com/lerna/lerna/tree/master/commands/run 각 패키지의 package.json에 정의된 script 를 실행합니다
lerna run start --scope=<package_name>
최상위 경로에 공통으로 사용되는 모듈을 설치하고자 하는 경우에는 workspace를 지정하였으므로 아래와 같이 -W 옵션을 붙여서 설치를 해주어야 한다.
-W
yarn add eslint prettier -D -W
최상위 경로에서 특정 패키지에 모듈을 설치하는 경우에는 scope를 지정해주어 아래와 같이 설치한다.
scope
lerna add <module_name> --scope=<package_name>
동일 repo의 다른 package 모듈을 참조하는 경우에는 아래와 같이 추가해준다.
npx lerna add <ref_package_name> --scope=<package_name>
lerna import
lerna를 이용한 모노레포 개발 환경 구성하기
Version
lerna v3.22.1
Configuration Story
Installation
위의 명령을 실행하면 해당 프로젝트 루트 폴더를 기준으로 아래와 같이 파일이 구성된다
lerna.json
lerna.json
을 이용하여 기본 설정 정보를 정의한다.packages
폴더를 기준으로 하여 해당 하위 폴더의package.json
을 파악하여 처리한다version: "independent"
로 정의하면 각 패키지의 버전을 독립적으로 가져갈 수 있다.Create packages
<root_dir>/pakcages
하위에 각 패키지 모듈 프로젝트를 생성한다.Command
lerna bootstrap
https://github.com/lerna/lerna/tree/master/commands/bootstrap 해당 명령을 수행하면 ignore 로 설정된 package 를 제외한 모든 package 의 npm install 을 실행한다. 의존이 있는 패키지는 설치 대신 Symlink를 정비 합니다.
lerna link convert
각 패키지에 설치된 모듈들이 루트로 끌어올려진다
lerna clean
https://github.com/lerna/lerna/tree/master/commands/clean 루트 경로의 node_modules를 제외하고, 각 패키지들의 node_modules을 삭제한다.
lerna create
해당 명령어를 이용하여 아래와 같이 정의된 스캐폴딩 구조를 갖춘 package를 생성할 수 있다.
lerna run script
https://github.com/lerna/lerna/tree/master/commands/run 각 패키지의 package.json에 정의된 script 를 실행합니다
Install dependency module
최상위 경로에 공통으로 사용되는 모듈을 설치하고자 하는 경우에는 workspace를 지정하였으므로 아래와 같이
-W
옵션을 붙여서 설치를 해주어야 한다.최상위 경로에서 특정 패키지에 모듈을 설치하는 경우에는
scope
를 지정해주어 아래와 같이 설치한다.동일 repo의 다른 package 모듈을 참조하는 경우에는 아래와 같이 추가해준다.
장단점
Good
Bad
lerna import
를 이용할 수 있지만 복잡한 히스토리라면 오히려 꼬여버릴 수 있음References
lerna를 사용 중인 대표적인 프로젝트들 엿보기