Bun 은 package.json 에서 workspaces 를 지원합니다. 워크스페이스를 사용하면 여러 독립 패키지로 구성된 모노레포 로 복잡한 소프트웨어를 쉽게 개발할 수 있습니다.
모노레포는 일반적으로 다음과 같은 구조를 가집니다.
<root>
├── README.md
├── bun.lock
├── package.json
├── tsconfig.json
└── packages
├── pkg-a
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
├── pkg-b
│ ├── index.ts
│ ├── package.json
│ └── tsconfig.json
└── pkg-c
├── index.ts
├── package.json
└── tsconfig.json루트 package.json 에서 "workspaces" 키는 모노레포 내에서 패키지/워크스페이스로 간주되어야 하는 하위 디렉토리를 나타내는 데 사용됩니다. 모든 워크스페이스를 packages 라는 디렉토리에 배치하는 것이 일반적입니다.
{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/*"],
"devDependencies": {
"example-package-in-monorepo": "workspace:*"
}
}NOTE
**Glob 지원** — Bun 은 `"workspaces"` 에서 전체 glob 구문을 지원하며 음수 패턴 (예: `!**/excluded/**`) 도 포함됩니다. 지원되는 구문의 포괄적인 목록은 [여기](/ko/runtime/glob#supported-glob-patterns) 를 참조하세요.{
"name": "my-project",
"version": "1.0.0",
"workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}각 워크스페이스는 자체 package.json 을 가집니다. 모노레포의 다른 패키지를 참조할 때 package.json 의 버전 필드로 semver 또는 워크스페이스 프로토콜 (예: workspace:*) 을 사용할 수 있습니다.
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "workspace:*"
}
}bun install 은 모노레포의 모든 워크스페이스에 대한 의존성을 설치하며 가능한 경우 패키지를 중복 제거합니다. 특정 워크스페이스의 의존성만 설치하려면 --filter 플래그를 사용할 수 있습니다.
# `pkg-c` 를 제외한 `pkg-` 로 시작하는 모든 워크스페이스의 의존성 설치
bun install --filter "pkg-*" --filter "!pkg-c"
# 경로도 사용할 수 있습니다. 이는 위 명령과 동일합니다.
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # 또는 --filter "!./packages/pkg-c"게시할 때 workspace: 버전은 패키지의 package.json 버전으로 대체됩니다.
"workspace:*" -> "1.0.1"
"workspace:^" -> "^1.0.1"
"workspace:~" -> "~1.0.1"특정 버전을 설정하면 패키지의 package.json 버전보다 우선합니다.
"workspace:1.0.2" -> "1.0.2" // 현재 버전이 1.0.1 이어도워크스페이스에는 몇 가지 주요 이점이 있습니다.
- 코드를 논리적 부분으로 분할 가능. 한 패키지가 다른 패키지에 의존하는 경우
package.json에 의존성으로 추가하기만 하면 됩니다. 패키지b가a에 의존하는 경우bun install은 npm 레지스트리에서 다운로드하는 대신 로컬packages/a디렉토리를node_modules에 설치합니다. - 의존성 중복 제거 가능.
a와b가 공통 의존성을 공유하는 경우 루트node_modules디렉토리로 hoisting 됩니다. 이는 중복된 디스크 사용량을 줄이고 동시에 설치된 여러 버전의 패키지와 관련된 "의존성 지옥" 문제를 최소화합니다. - 여러 패키지에서 스크립트 실행.
--filter플래그 를 사용하여 워크스페이스의 여러 패키지에서package.json스크립트를 쉽게 실행하거나--workspaces를 사용하여 모든 워크스페이스에서 스크립트를 실행할 수 있습니다.
카탈로그로 버전 공유
많은 패키지에서 동일한 의존성 버전이 필요할 때 카탈로그를 사용하면 루트 package.json 에 버전을 한 번 정의하고 워크스페이스에서 catalog: 프로토콜로 참조할 수 있습니다. 카탈로그를 업데이트하면 이를 참조하는 모든 패키지가 자동으로 업데이트됩니다. 자세한 내용은 카탈로그 를 참조하세요.
NOTE
⚡️ **속도** — 설치가 빠릅니다. 대규모 모노레포에서도 마찬가지입니다. Bun 은 Linux 에서 [Remix](https://github.com/remix-run/remix) 모노레포를 약 `500ms` 만에 설치합니다.npm install보다 28 배 빠름yarn install(v1) 보다 12 배 빠름pnpm install보다 8 배 빠름