运行时包管理器打包器测试运行器代码检查格式化指南参考博客反馈

使用 workspaces 配置 monorepo

Bun 的包管理器支持 npm 的 "workspaces"。Workspaces 将代码库拆分为位于同一仓库中的不同软件包,这些软件包可以相互依赖,并且(在可能的情况下)共享一个 node_modules 目录。

克隆这个示例项目来尝试使用 workspaces。


根目录下的 package.json 不应包含 "dependencies"、"devDependencies" 或其他依赖字段。每个软件包都应自包含,并声明自己的依赖项。通常会声明 "private": true,以避免不小心将根软件包发布到 npm。

package.json
{
  "name": "my-monorepo",
  "private": true,
  "workspaces": ["packages/*"]
}

通常会将所有软件包放在 packages 目录中。package.json 中的 "workspaces" 字段支持 glob 模式,因此 packages/* 会将 packages 下的每个子目录视为一个独立的 软件包(也称为 workspace)。

File
.
├── package.json
├── node_modules
└── packages
    ├── stuff-a
    │   └── package.json
    └── stuff-b
        └── package.json

要在 workspaces 之间添加依赖,请使用 "workspace:*" 语法。以下示例将 stuff-a 添加为 stuff-b 的依赖项。

packages/stuff-b/package.json
{
  "name": "stuff-b",
  "dependencies": {
    "stuff-a": "workspace:*" // [!code ++]
  }
}

添加依赖项后,请从项目根目录运行 bun install,为所有 workspaces 安装依赖项。

terminal
bun install

要向特定 workspace 添加 npm 依赖项,请切换到该目录并像平常一样运行 bun add。Bun 会检测到你位于 workspace 中,将依赖项添加到该 workspace 的 package.json,并更新根锁定文件。新 workspaces 默认使用隔离安装,因此 Bun 会将软件包安装到根目录的 node_modules/.bun 存储中,并从 workspace 自身的 node_modules 创建符号链接。使用 --linker hoisted 时,Bun 会改为将软件包提升到根目录的 node_modules 中。

terminal
cd packages/stuff-a
bun add zod

请参阅 bun install。