仓库
文档
工作区

工作区

工作区是单体仓库的构建块。您添加到单体仓库的每个应用程序和包都将 **位于其自己的工作区内**。

工作区由您的 包管理器 管理,因此请确保您已先设置好它。

配置工作区

要使用工作区,您必须首先将它们的文件系统位置声明给您的包管理器。

我们推荐的常见约定是在顶层使用 apps/packages/ 目录。这不是必需的 - 只是一个建议的目录结构。

apps 文件夹应包含可启动应用程序的工作区,例如 Next.js (在新标签页打开)Svelte (在新标签页打开) 应用程序。

packages 文件夹应包含由应用程序或其他包使用的包的工作区。

将您要配置为工作区的文件夹添加到根 package.json 文件中的 workspaces 字段。此字段包含以 glob 形式表示的工作区文件夹列表

{
  "name": "my-monorepo",
  "version": "1.0.0",
  "workspaces": [
    "docs",
    "apps/*",
    "packages/*"
  ]
}
my-monorepo
├─ docs
├─ apps
│  ├─ api
│  └─ mobile
├─ packages
│  ├─ tsconfig
│  └─ shared-utils
└─ sdk

在上面的示例中,my-monorepo/apps/my-monorepo/packages/ 内的所有目录都是工作区,my-monorepo/docs 目录本身也是一个工作区。 my-monorepo/sdk/ 不是工作区,因为它未包含在工作区配置中。

命名工作区

每个工作区都有一个唯一的名称,该名称在其 package.json 中指定

{
  "name": "shared-utils"
}

此名称用于

  1. 指定 包应安装到的工作区
  2. 在其他工作区中使用此工作区
  3. 发布包:它将以您指定的 name 在 npm 上发布

您可以使用 npm 组织或用户范围来避免与 npm 上的现有包发生冲突。例如,您可以使用 @mycompany/shared-utils

相互依赖的工作区

要在另一个工作区内使用工作区,您需要将其指定为依赖项,使用其名称。

例如,如果我们希望 apps/docs 导入 packages/shared-utils,我们需要在 apps/docs/package.json 中添加 shared-utils 作为依赖项

{
  "dependencies": {
    "shared-utils": "*"
  }
}

使用 * 可以让我们引用依赖项的最新版本。这样可以避免在包版本发生变化时需要手动更新依赖项版本。

就像普通的包一样,我们需要从根目录运行 install 命令。安装完成后,我们可以像使用其他包一样从 node_modules 中使用工作区。更多信息请查看我们的 代码共享部分

管理工作区

在单仓库中,当您从根目录运行 install 命令时,会发生以下几件事:

  1. 检查您已安装的工作区依赖项。
  2. 所有工作区都将被 符号链接 (在新标签页中打开)node_modules 中,这意味着您可以像使用普通包一样导入它们。
  3. 其他包将被下载并安装到 node_modules 中。

这意味着,无论何时添加/删除工作区,或更改它们在文件系统中的位置,您都需要从根目录重新运行 install 命令来重新设置工作区。

不需要在每次源代码更改时都重新安装 - 只有当您以某种方式更改工作区的位置(或配置)时才需要重新安装。

如果您遇到问题,您可能需要删除存储库中的每个 node_modules 文件夹,然后重新运行 install 命令来进行修复。