node_modules
폴더를 탐색해서 해당 패키지를 검색합니다.node_modules
에 패키지들을 설치하고 디펜던시-하위디펜던시의 관계를 트리형인 Hoisting 구조로 관리합니다.node_modules/.pnpm
폴더에 정리합니다.foo
에서 bar, qar
이 직접 참조되기 때문에 심볼릭 링크foo -> ./.pnpm/foo@1.0.0/node_modules/foo
로 가능함하위 내용은 공식문서를 읽고 ChatGPT 3.5에 질문을 해서 얻은 답을 약간 수정했습니다.
-> 위에 예시에서 utils가 직접 참조인 logger, fomatter를 참조하는게 아닌 하위 패키지를 참조한다면 심볼릭 링크로 생성 될 수 없습니다.
libs
라는 폴더를 만들어 해당 폴더에서는 각 애플리케이션이 공통으로 사용하는 DB와 같은 인프라 세팅이나 간단한 utils 함수, 추상화를 위한 부모클래스 등이 존재할 수 있습니다.→ Monorepo mode로 구축하며 모듈이 application / library 역할로 나뉘어집니다.
nest-cli.json 파일에 monorepo로 설계된 프로젝트들에 대한 메타데이터가 기록됩니다.
npm install -g pnpm
$ nest new 프로젝트명
- pnpm (패키지 매니저 선택)
→ apps 폴더안에 설정한 앱이름의 폴더가 생성됩니다
$ nest g app 앱이름
→ libs 폴더안에 설정한 라이브러리 폴더가 생성됩니다
$ nest g lib core
-> NestJS 모노레포 템플릿을 참고하여 설명합니다
├── libs ├── core
: 핵심 비즈니스가 담긴 모듈로 타 애플리케이션에서 공유할 클래스 등을├── libs ├── modules
: http, databse 같은 인프라 관리 모듈├── libs ├── utils
: 유틸리티 관련 모듈→ pnpm으로 직접 모노레포 구축시에는 package 인식을 위해 필요하지만 nestjs의 workspaces 방식을 사용한다면 불필요합니다.
packages:
- apps/*
- libs/*
$ pnpm install
$ pnpm add 패키지
app
은 apps 폴더안에 있는 폴더명을 입력$ pnpm build app
$ pnpm start app
$ pnpm add <package> # dependencies
$ pnpm add -D <package> # devDependencies
$ pnpm add -g <package> # global
NestJS 경우에는 기본적으로 모노레포 구축을 위한 공식지원이 있어서 만드는데에 큰 어려움은 없었다. 회사에서 Yarn Berry로도 전에 만들어서 써본적이 있었는데 cache 폴더 관리도 번거롭고 앱별로 패키지 설치하는게 번거로웠어서 PNPM을 시도해보게 되었다.
내용도 쉽고 패키지 관리도 여러모로 장점이 많은 것 같아서 PNPM&NestJS 모노레포 조합은 앞으로도 쓸 것 같아 추후 다시보기 위해 정리했습니다...