모노레포를 사용하기 위해 편리한 도구들이 있다.
Yarn , Learn ,Nx , Turborepo 등 많이 있지만 yarn과 learn에 대해서만 알아보려고 한다.
npm도 있다고는 들었다(?)
자료를 찾다가 읽었는데 yarn이 우선으로 가지고 있어서 yarn을 모노레포때문에 사용한다고 했다가 후발주자로 npm도 모노레포가 되도록 업데이트 했다고 읽었다.
일단 공부는 naver D2에서 정리된 개념으로 공부했다. 나중에 실제로 사용하게 되면
좀더 자세히 알아보고 오늘은 겉핡기식으로 정리해보려고 한다.
naver D2 모노레포 도구
나머지들은 위의 사이트에서 확인해보자.
Yarn 은 workspaces 필드를 사용해서 모노레포를 구성할수있다.
package.json 에 workspace root 라는 것을 설정해둔다.
{
"private": true,
"workspaces": ["workspace-a", "workspace-b"]
}
공식문서에서는 "workspace-a", "workspace-b" 이렇게 스페이스를 나눠놓았다.
이렇게 설정한다음 각각 "workspace-a", "workspace-b”폴더를 만들고
그 폴더 내부에 package.json 을 각각 만들어 준다.
workspace-a/package.json
{
"name": "workspace-a",
"version": "1.0.0",
"dependencies": {
"cross-env": "5.0.5"
}
}
예시는 workspace-a 만 설정한 것만 작성했다. Workspace-b 설정한 다음 yarn install 을 루트에서 실행하면 루트 경로 node_modules에 심볼릭 링크가 생긴다.
yarn workspace <WORKSPACE_NAME> <COMMAND_NAME>
위의 명령어로 실행한다.
Yarn workspace <WORKSPACE_NAME> run start
실행하면 된다.
이렇게 되면 한쪽에서 모듈로 함수를 만들어서 export 하면
다른 레포지토리에서 모듈을 받아서 사용이 가능하다.
예) workspace-a 에서 module.exports = {hello () {console.log(‘hello’)}} 작성하고
workspace-b에서 const workspaceA = require(“workspace-a”)를 설정하고
객체의 함수, 변수 등을 꺼내서 사용할수 있다.
workspaceA.hello(); //‘hello’
Workspace 의존 관계 확인
yarn workspaces info
루트 프로젝트에 의존성 추가
yarn add <PACKAGE_NAME> -W
workspace를 의존성으로 추가
yarn workspace <WORKSPACE_NAME> add <WORKSPACE_NAME>
npm, yarn 등은 중복 의존성 설치를 방지하기 위해 호이스팅(hosting) 기법을 사용한다.
node_modules의 문제점이 있다.
그래서 yarn berry를 사용 하여 pnp로 해결한다.
Yarn berry 는 node_modules에 패키지 파일을 저장하는 대신 캐시 폴더에 수평적으로 저장하는 방법으로 문제를 해결했다고 한다.
Pnp ( plug’n’play) 라고 부른다.
PnP로 얻는 것
2022년 Nx의 개발사인 Nrwl이 프로젝트 관리 권한을 인수했다.
npm install --global lerna
프로젝트를 lerna로 초기화한다.
cd path/to/your-project
lerna init
lerna.json
workspace 추가
lerna create <PACKAGE-NAME>
패키지 추가
client workspace에 react 패키지를 추가한다.
lerna add react --scope=client
--scope 없이 사용하면 모든 workspace에 추가한다.
추가하려는 의존성이 workspace라면 해당 workspace를 제외한 모든 workspace에 추가된다.
client workspace에 common workspace를 추가한다.
lerna add common@0.0.0 --scope=client
모든 workspace에 대해 npm 스크립트 실행
lerna run <COMMAND_NAME> -- [..args]
이외에도 다양한 명령어가 있는데 공식문서를 찾아보도록 하자.
오늘은 모노레포의 도구들에 대해서 간략하게 알아봤다.
직접 사용하게 된다면 더 공부해보고 정리를 추가로 해보도록 하겠다.