Runtime
Bundler
Package Manager
Test Runner
Guides
Reference
Blog
Install Bun
Guides Package Manager

Configuring a monorepo using workspaces

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 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.

package.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).

File 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.

packages/stuff-b/package.json
{
  "name": "stuff-b",
  "dependencies": {
    "stuff-a": "workspace:*"
  }
}

Once added, run bun install from the project root to install dependencies for all workspaces.

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 and hoists the dependency as needed.

terminal
$ cd packages/stuff-a
$ bun add zod

See bun install.

On this page

No Headings