Serverless + Lerna + Yarn Workspaces (1) Yarn Workspaces
3 min readAug 12, 2021
Why?
Monorepo 상태로 람다 함수를 관리하고 싶다.
- 서버에서 사용하는 람다 함수 증가로 인한 관리의 어려움
- 각 함수 덩어리별로 권한을 다르게 할당하기 위함
- 목적별로 람다를 분리하여 사용성을 높이기 위함
- 일부 코드 변화로 인해 전체에 영향을 주고 싶지 않음
https://serverless-stack.com/chapters/using-lerna-and-yarn-workspaces-with-serverless.html
Why Yarn?
- 패키지 다운로드 속도가 더 빠르다.
(병렬 작업 실행, 현재는 거의 비슷하다고 하지만) - 기능이 더 많다.
(그리고 기능이 더 빨리 추가된다.) - 요즘에는 Yarn 또한 거의 Node 빌트인으로 취급해준다.
(eg. Node 도커 이미지에서 Yarn도 포함시켜서 제공) - Workspaces 기능을 제공한다.
Yarn Workspaces
- 프로젝트들에 서로 참조하는 연관 관계를 줄 수 있음
- 저장소 루트에 package.json 파일을 만들고 아래의 내용을 입력
{
"private": true,
"workspaces": ["serverless-a", "serverless-b", "serverless-c"]
}
- “workspaces” 라는 속성이 들어가고, 여기에 프로젝트 이름 (각각의 프로젝트의 package.json에 정의된 name)을 나열
이제 Yarn 은 저장소를 워크스페이스로 인식하게 된다.
- 각각의 프로젝트는 마치 npm 패키지의 로컬 사본처럼 저장소 루트의 node_modules 에 저장됨
- 저장소 루트 하나에만 node_modules, yarn.lock 이 생성
Before
serverless-a
- node_modules
- package.json
- yarn.lockserverless-b
- node_modules
- package.json
- yarn.lockserverless-c
- node_modules
- package.json
- yarn.lock
After
(단, 일부 devDependencies에서 사용하는 바이너리 때문에 각 프로젝트 별로 모듈이 들어간 node_modules 디렉터리가 생길 수 있음)
node_modules
package.json
yarn.lock
serverless-a
package.json serverless-b
package.json serverless-c
package.json
- yarn install 을 실행하면 워크스페이스 전체에 대해 패키지를 설치하고 yarn.lock 파일을 갱신
결론
프로젝트를 분리해서 개발할 필요가 있을 시 Yarn Workspaces는 유용하다.