Serverless + Lerna + Yarn Workspaces (1) Yarn Workspaces

Daniel any
3 min readAug 12, 2021

Why?

Monorepo 상태로 람다 함수를 관리하고 싶다.

  1. 서버에서 사용하는 람다 함수 증가로 인한 관리의 어려움
  2. 각 함수 덩어리별로 권한을 다르게 할당하기 위함
  3. 목적별로 람다를 분리하여 사용성을 높이기 위함
  4. 일부 코드 변화로 인해 전체에 영향을 주고 싶지 않음

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.lock
serverless-b
- node_modules
- package.json
- yarn.lock
serverless-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는 유용하다.

참고

--

--