lerna
모노레포 관리 툴.
npx lerna init으로 lerna 초기화(lerna.json 파일 및 프로젝트 기본 구조 생성.).
lerna.json 옵션
private:truenpm 배포 안 함.workspaces: 패키지 폴더가 위치할 경로 선택(일반적으로는packages/*사용.).
$ lerna run test: 모든 패키지의 test 스크립트 실행.
$ lerna run test --scope=@sooni/common
test 스크립트를 실행할 패키지의 범위 설정 가능.
$ lerna run test --scope={@sooni/common,@sooni/server}
중괄호로 여러 패키지 지정 가능.
$ lerna version
- lerna가 변화가 생긴 패키지의 버전을 자동으로 업그레이드하고(
package.json에도 자동으로 반영), - 해당 버전의 커밋과 태그를 만들고,
- 리모트 저장소에 푸쉬함.
자동 지정되는 버전이 마음에 안 들면 직접 지정도 가능.
$ lerna version 1.0.1$ lerna version patch
사용할 수 있는 키워드는 다음과 같음.
majorminorpatchpermajorpreminorprepatchprerelease
$ lerna version --yes
버전을 올릴 때 프롬프트가 물어보지 않음. CI 자동화할 때 필수 옵션.
$ lerna version --conventional-commits
버전을 올릴 때 conventional commits 규칙에 따라 체인지 로그 파일을 프로젝트 루트 경로에 하나, 각 패키지별 폴더 안에 하나씩 만들어줌.
yarn
$ yarn add -D package-name : package-name을 데브 디펜던시로 설치.
$ yarn add -W package-name
== $yarn add --ignore-workspace-root-check package-name
패키지를 설치할 때 지정한 워크스페이스 경로를 무시하고 패키지 설치(devDependency를 프로젝트 최상단에 설치할 경우 사용)
$ yarn create <starter-kit-package> [<args>]
create-react-app 같은 스타터 킷을 편리하게 사용하는 yarn 명령어. 해당 모듈을 글로벌로 설치하고 전달받은 인자로 스타터 킷을 실행한다.
위의 명령어는 아래 두 명령어와 동일한 기능을 한다. yarn 공식문서
$ yarn create create-react-app samle-app
$ yarn global add create-react-app
$ create-react-app my-app
yarn workspace
$ yarn init -y로 package.json 생성.
프로젝트 루트 경로에 있는 package.json를 다음과 같이 설정한다.
{
"workspaces": [
"packages/*"
],
"private": "true",
...
}
이렇게 하면 프로젝트 폴더 내의 packages 라는 폴더에 여러 모듈 디렉토리를 만들어 모노레포로 관리할 수 있디.
NPM 배포를 원하지 않는다면 private 를 true로 설정해야 함.
sooni/
├─ packages/
│ ├─ common/
│ │ ├─ index.js
│ │ ├─ package.json
│ ├─ server/
│ │ ├─ index.js
│ │ ├─ package.json
├─ package.json
packages 폴더 내부에 모듈별로 폴더를 만든다.
그 안에서 전부 $ yarn init 을 실행.
package.json 안의 name에 @패키지이름/을 추가해줌.
{
"name": "@sooni/server",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"@sooni/common": "1.0.0",
...
}
이제 $ yarn install 명령을 실행하면 다른 모듈을 마치 NPM 모듈처럼 import할 수 있음.
사용하고자 하는 모듈을 dependencies 안에 추가하고 $ yarn install 을 실행하면 프로젝트 루트 디렉토리의 node_modules 폴더에 링크를 생성.
이후 import module_name from "@sooni/common"; 과 같이 사용가능.
이제 각 모듈 내부에서 의존성 모듈을 설치하면 전부 루트 디렉토리의 node_modules 폴더 안에 설치됨(호이스팅).
동일한 패키지를 여러 모듈에서 사용하는 경우에 관리가 편함.
헷갈리는 경우
기존에 설치한 모듈을 다른 버전으로 설치하면 그 버전이 루트 경로에 설치되고, 기존 버전은 기존 모듈을 사용했던 디렉토리 내부의 node_modules 폴더 안으로 이동됨.
만약 같은 모듈을 다른 버전으로 각각의 모듈 디렉토리에서 사용하다가 버전을 통일하면 어떻게 될까?
=> yarn에서 자동으로 통일된 버전을 루트 node_modules 에 설치하고, 각 모듈 디렉토리 안에 존재했던 다른 버전들을 모두 삭제함.