mirror of
https://github.com/oven-sh/bun
synced 2026-02-10 19:08:50 +00:00
* Skeleton code for `bun run --workspace` * Update run_command.zig * implement directory traversal to find workspace root * finish --workspace implementation * clean up changes in run_command.zig * add workspace tests, update harness to handle nested dirs * [autofix.ci] apply automated fixes * basic filtering * [autofix.ci] apply automated fixes * working filter without patterns * update tests, filter mostly working * simplify package name parsing, commit tests * support filter even without workspace setup * move filter arg handling to separate source file * use bun.sys.chdir, match root package for scripts * fix exit code handling * ignore node_modules and directories starting with . in --filter * progress converting --filter to use iterators * convert filtering to use iterators * cleanup * implement DirEntry access method for glob (currently crashing) * cleanup and fixes * run js files in subprocess when filter flag passed * clean up dead code * fix fd leak in run_command.zig * [autofix.ci] apply automated fixes * fix issues after merge * use posix-spawn in runBinary, fix resource PATH variable resource leak * move filter argument to runtime category * fix test harness * add js and binary tests to filter-workspace * [autofix.ci] apply automated fixes * fix compile after merge * [autofix.ci] apply automated fixes * clean up filter-workspace test * [autofix.ci] apply automated fixes * fixes to running binaries * fix actually setting cwd_override * windows fixes * address some review comments * handle malformed JSON * add various tests * [autofix.ci] apply automated fixes * update docs for filter * [autofix.ci] apply automated fixes * reset tinycc commit * filtered run prototype * make pretty * implement abort handler (not working) * make prettier * prep for windows * windows path and printing fixes * implement log-style output (not tui) * fix issues when logging to file * revert a bunch of unecessary changes * cleanup * implement dependency order execution * detect circular dependencies, fix cancel hang * Fix `$PATH` * ignore dep order on loop, stream on linux, sort pkgs * support pre and post scripts * add more filter tests, print elapsed time * enable 'bun --filter' without run * fix harness after merge * [autofix.ci] apply automated fixes * print number of scripts we're waiting for * update docs, fix windows build * fix tests on windows * [autofix.ci] apply automated fixes * fix uninitialized memory * use terminal synchronized update sequences * Add skip list * Preallocate * Use current bun in tests --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
75 lines
3.0 KiB
Markdown
75 lines
3.0 KiB
Markdown
Bun supports [`workspaces`](https://docs.npmjs.com/cli/v9/using-npm/workspaces?v=true#description) in `package.json`. Workspaces make it easy to develop complex software as a _monorepo_ consisting of several independent packages.
|
||
|
||
It's common for a monorepo to have the following structure:
|
||
|
||
```
|
||
tree
|
||
<root>
|
||
├── README.md
|
||
├── bun.lockb
|
||
├── 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
|
||
```
|
||
|
||
In the root `package.json`, the `"workspaces"` key is used to indicate which subdirectories should be considered packages/workspaces within the monorepo. It's conventional to place all the workspace in a directory called `packages`.
|
||
|
||
```json
|
||
{
|
||
"name": "my-project",
|
||
"version": "1.0.0",
|
||
"workspaces": ["packages/*"],
|
||
"devDependencies": {
|
||
"example-package-in-monorepo": "workspace:*"
|
||
}
|
||
}
|
||
```
|
||
|
||
{% callout %}
|
||
**Glob support** — Bun supports simple `<directory>/*` globs in `"workspaces"`. Full glob syntax (e.g. `**` and `?`) is not yet supported.
|
||
{% /callout %}
|
||
|
||
Each workspace has it's own `package.json` When referencing other packages in the monorepo, use `"workspace:*"` as the version field in your `package.json`.
|
||
|
||
```json
|
||
{
|
||
"name": "pkg-a",
|
||
"version": "1.0.0",
|
||
"dependencies": {
|
||
"pkg-b": "workspace:*"
|
||
}
|
||
}
|
||
```
|
||
|
||
{% callout %}
|
||
**Version support** — Bun supports simple `workspace:*` versions in `"dependencies"`. Full version syntax (e.g. `workspace:^*`) is not yet supported.
|
||
{% /callout %}
|
||
|
||
Workspaces have a couple major benefits.
|
||
|
||
- **Code can be split into logical parts.** If one package relies on another, you can simply add it as a dependency in `package.json`. If package `b` depends on `a`, `bun install` will install your local `packages/a` directory into `node_modules` instead of downloading it from the npm registry.
|
||
- **Dependencies can be de-duplicated.** If `a` and `b` share a common dependency, it will be _hoisted_ to the root `node_modules` directory. This reduces redundant disk usage and minimizes "dependency hell" issues associated with having multiple versions of a package installed simultaneously.
|
||
- **Run scripts in multiple pacakges.** You can use the [`--filter` flag](/docs/cli/filter.md) to easily run `package.json` scripts in multiple packages in your workspace.
|
||
|
||
{% callout %}
|
||
⚡️ **Speed** — Installs are fast, even for big monorepos. Bun installs the [Remix](https://github.com/remix-run/remix) monorepo in about `500ms` on Linux.
|
||
|
||
- 28x faster than `npm install`
|
||
- 12x faster than `yarn install` (v1)
|
||
- 8x faster than `pnpm install`
|
||
|
||
{% image src="https://user-images.githubusercontent.com/709451/212829600-77df9544-7c9f-4d8d-a984-b2cd0fd2aa52.png" /%}
|
||
{% /callout %}
|