2024. 12. 16. 21:44ㆍNodejs
1. Yarn Workspaces란?
Yarn Workspaces는 모노레포(monorepo) 환경에서 여러 패키지를 하나의 리포지토리에서 효율적으로 관리할 수 있도록 도와주는 Yarn의 기능입니다.
2. 모노레포란?
모노레포는 여러 패키지나 프로젝트를 단일 리포지토리에서 관리하는 구조입니다. 이를 통해 의존성 공유 및 재사용, 일관된 코딩 스타일 및 빌드 도구 설정, 변경 사항에 대한 통합 관리가 가능합니다.
3. Yarn Workspaces 설정하기
Workspaces를 설정하려면 package.json에서 workspaces 필드를 정의해야 합니다. 아래와 같이 직접 구성해도 되지만, yarn init을 할 때 -w 옵션을 추가하면 package.json 설정과 함께 packages 폴더를 생성합니다.
yarn init -2 -w
{
"private": true,
"workspaces": ["packages/*"]
}
하위 패키지의 package.json은 아래와 같이 구성합니다.
{
"name": "my-package",
"version": "1.0.0"
}
4. Yarn Workspaces 관련 명령어
워크스페이스에 등록된 모든 패키지를 확인하려면 아래의 명령어를 사용합니다.
yarn workspaces list
특정 워크스페이스에 명령을 실행하려면 아래의 명령어를 사용합니다. 아래의 예시는 특정 워크스페이스에 lodash를 설치합니다.
yarn workspace <workspace-name> add lodash
반대로 모든 워크스페이스에 명령을 실행하려면 아래의 명령어를 사용합니다. 아래의 예시는 모든 워크스페이스에 있는 build 스크립트를 실행합니다. --parallel 옵션을 추가하면 명령을 병렬로 실행합니다. --topological, --topological-dev 옵션을 추가하면 종속성 순서를 고려하여 실행합니다.
yarn workspaces foreach -A run build
아래의 명령어를 사용하면 현재 디렉토리를 기준으로 하위 패키지들의 명령어를 실행합니다. 더 많은 옵션은 공식 문서에서 확인할 수 있습니다.
yarn workspaces foreach -W run test
yarn install은 전체 워크스페이스의 의존성을 설치합니다. 이는 모노레포에 많은 패키지가 포함되어 있을 경우 시간이 오래 걸릴 수 있습니다. 대신 아래의 명령어를 통해 특정 패키지에 대한 의존성만 설치할 수 있습니다. 특정 패키지에 대해서 디버깅을 하거나 배포할 때 유용하게 사용할 수 있습니다.
yarn workspaces focus <pacakge-name>
5. 의존성 관리
모든 패키지에서 공통적으로 사용하는 의존성을 설치하려면 루트 디렉토리에서 의존성을 설치해야 합니다. 예를 들어, 공통 의존성으로 타입스크립트를 설치하고 모든 패키지에 타입스크립트 설정을 추가하려면 아래와 같이 명령어를 실행합니다.
# 공통 의존성 설치
# 루트 디렉토리에서
yarn add -D typescript
# 모든 패키지에 타입스크립트 설정
yarn workspaces foreach run -A tsc --init
하지만, 모든 패키지에 타입스크립트 설정하는 명령어를 실행해도 각 패키지에 tsconfig.json이 생성되지 않습니다. 안타깝게도 yarn workspace에서는 공통 의존성을 설치해도 각 패키지의 package.json에 명시해야 사용할 수 있습니다. 아래와 같이 각 패키지의 package.json의 devDependencies에 typescript를 추가합니다. 이때 버전은 "*"를 사용합니다.
{
"name": "my-package",
"version": "0.0.0",
"scripts": {
"build": "tsc"
},
"dependencies": {
...
},
"devDependencies": {
...
"typescript": "*"
}
}
위와 같이 추가하고 yarn install을 실행한 뒤 다시 명령어를 실행하면 각 패키지에 tsconfig.json이 생성되는 것을 확인할 수 있습니다.
yarn install
yarn workspaces foreach -A run tsc --init
물론 아래와 같이 모든 패키지에 의존성을 추가하는 방식으로 해결할 수도 있습니다. 하지만 이 방법은 각 패키지별로 버전이 달라질 수 있으므로 주의해야 합니다.
yarn workspaces foreach -A add -D typescript
로컬 패키지 간의 의존성은 아래와 같이 추가할 수 있습니다. 로컬 패키지의 버전은 "workspace:"로 표시되는 것을 확인할 수 있습니다.
yarn workspace <package-name> add <package-name>
6. 한계
Yarn Workspaces는 모노레포를 구성하고 각 패키지의 스크립트를 효율적으로 관리하는 기능을 제공하지만, 의존성 관리와 빌드 최적화 측면에서는 부족함이 있을 수 있습니다. 특히 공통 의존성 설정이 번거롭고 대규모 프로젝트에서 빌드 성능을 최적화하기 어렵습니다. 이러한 한계를 극복하려면 Lerna, Nx, Turborepo와 같은 도구를 함께 사용하는 것을 추천합니다. 이를 통해 의존성 관리, 빌드 시간 단축, 배포 자동화를 보다 효율적으로 구현할 수 있습니다.
'Nodejs' 카테고리의 다른 글
슬랙으로 RSS 알림 보내기 (1) - 개요 (0) | 2025.02.15 |
---|---|
모듈 시스템 - 타입스크립트에서 ESM 사용하기 (0) | 2025.01.02 |
모듈 시스템 - CommonJS, AMD, ESM (0) | 2024.12.28 |
패키지 매니저 - pnpm (1) | 2024.12.15 |
패키지 매니저 - Yarn (2) | 2024.12.15 |