71 lines
2.3 KiB
Plaintext
71 lines
2.3 KiB
Plaintext
---
|
|
title: Configuring a monorepo using workspaces
|
|
sidebarTitle: Workspaces with Bun
|
|
mode: center
|
|
---
|
|
|
|
Bun's package manager supports npm `"workspaces"`. Workspaces split a codebase into distinct packages that live in the same repository, can depend on each other, and (when possible) share a `node_modules` directory.
|
|
|
|
Clone [this sample project](https://github.com/colinhacks/bun-workspaces) to experiment with workspaces.
|
|
|
|
---
|
|
|
|
The root `package.json` should not contain `"dependencies"`, `"devDependencies"`, or other dependency fields. Each package should be self-contained and declare its own dependencies. It's conventional to declare `"private": true` to avoid accidentally publishing the root package to `npm`.
|
|
|
|
```json package.json icon="file-json"
|
|
{
|
|
"name": "my-monorepo",
|
|
"private": true,
|
|
"workspaces": ["packages/*"]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
It's common to place all packages in a `packages` directory. The `"workspaces"` field in `package.json` supports glob patterns, so `packages/*` treats each subdirectory of `packages` as a separate _package_ (also known as a workspace).
|
|
|
|
```txt File Tree icon="folder-tree"
|
|
.
|
|
├── package.json
|
|
├── node_modules
|
|
└── packages
|
|
├── stuff-a
|
|
│ └── package.json
|
|
└── stuff-b
|
|
└── package.json
|
|
```
|
|
|
|
---
|
|
|
|
To add dependencies between workspaces, use the `"workspace:*"` syntax. The following adds `stuff-a` as a dependency of `stuff-b`.
|
|
|
|
```json packages/stuff-b/package.json icon="file-json"
|
|
{
|
|
"name": "stuff-b",
|
|
"dependencies": {
|
|
"stuff-a": "workspace:*" // [!code ++]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
Once you add the dependency, run `bun install` from the project root to install dependencies for all workspaces.
|
|
|
|
```sh terminal icon="terminal"
|
|
bun install
|
|
```
|
|
|
|
---
|
|
|
|
To add npm dependencies to a particular workspace, `cd` to that directory and run `bun add` as you normally would. Bun detects that you are in a workspace, adds the dependency to that workspace's `package.json`, and updates the root lockfile. New workspaces use [isolated installs](/pm/isolated-installs) by default, so Bun installs the package into the root `node_modules/.bun` store and symlinks it from the workspace's own `node_modules`. With `--linker hoisted`, Bun hoists the package into the root `node_modules` instead.
|
|
|
|
```sh terminal icon="terminal"
|
|
cd packages/stuff-a
|
|
bun add zod
|
|
```
|
|
|
|
---
|
|
|
|
See [`bun install`](/pm/cli/install).
|