要在 macOS 上的 npm 工作区项目中为单个包安装依赖项,请在项目根目录下运行 npm install --workspace="packages/web",并将 packages/web 替换为该工作区的路径或其包名称。您也可以切换到该工作区目录并运行 npm install。这些命令用于在 npm 项目中选择某个工作区;它们不会创建单独的安装目录,也不能保证仅有该包的文件发生更改。

检查项目是否为 npm 工作区

npm 工作区是指在根目录 package.json 的 workspaces 下列出的包目录。例如,一个代码仓库可能包含一个根目录 package.json 和一个 packages/web/package.json,且根目录的工作区列表中包含 "packages/*"。npm 使用该配置来识别和链接本地包。如果该文件夹未被配置为工作区,则无法使用 --workspace 将其作为目标。请参阅 npm 的工作区文档。

在终端中,进入代码仓库根目录。在 macOS 上,请为包含空格的路径加上引号,以便 shell 将该路径视为单个参数:

cd "$HOME/Projects/sample monorepo"
npm install --workspace="packages/web"

此处,packages/web 是相对于代码仓库根目录的示例路径。您也可以使用已配置工作区的包名称来代替,例如 npm install --workspace="@example/web"。npm 文档中指出工作区名称、工作区目录路径和父工作区路径均为有效选择器。建议优先使用具体的包路径或名称:选择父工作区目录可能会选中其下的所有工作区。npm 的 npm install 选项中对该选择器进行了说明。

安装所选工作区声明的依赖项

上述命令会在所选工作区的上下文中运行安装。在 install 后面不跟包名的情况下,npm 会安装项目清单中已声明的依赖项;它不会向 packages/web/package.json 添加新的依赖项。在选择单个工作区时,npm 的工作区配置默认排除根项目,除非启用了 include-workspace-root。npm 配置参考记录了这两个选项。

如果要添加新包,请在工作区选择器之前包含其名称:

npm install date-fns --workspace="packages/web"

这将指示 npm 将 date-fns 添加到该工作区的依赖项中并进行安装。之后请检查该工作区的 package.json,以确认依赖项已记录在预期的位置。npm 的工作区指南针对向指定工作区添加依赖项给出了相同的模式。

改为直接使用工作区目录

如果您已经在该包的文件夹中工作,可以直接在该处运行 npm install,而无需指定 --workspace:

cd "$HOME/Projects/sample monorepo/packages/web"
npm install

npm 文档说明,在工作区内运行命令会隐式设置工作区上下文,并将工作区根目录用作项目前缀。在专门用于某个包的终端标签页中,这种方式会很方便。如果您不确定当前目录属于哪个包,请在已知的代码仓库根目录下使用显式的 --workspace 命令。

了解“单个工作区”的含义及局限

选择单个工作区只会限制命令的工作区上下文;它并不保证会生成一个物理上独立的 node_modules 树。npm 工作区是从顶层项目进行管理的,npm 可以将本地工作区链接到根目录的 node_modules 目录中。在依赖树允许的情况下,依赖项可能会被提升(hoisted)或共享。因此,安装操作可能会影响代码仓库共享的安装状态和 lockfile。请在版本控制中查看生成的更改,特别是当您原本期望仅对单个包的文件系统进行更改时。npm 的安装文档解释了其依赖树行为和工作区链接机制。

如果您的目标是获得一个完全独立、与 monorepo 隔离的安装,工作区选择器并不是实现该目的的机制。工作区是已配置的根项目的一部分;针对它进行操作并不会使其变成一个独立的代码仓库或安装树。

如果 npm 无法识别目标

首先验证路径相对于代码仓库根目录是否正确,以及其 package.json 是否存在。然后检查根目录的 package.json,确认其 workspaces 模式包含了该文件夹。如果使用名称,请确认它与工作区包的 name 字段匹配。从代码仓库根目录运行命令,或者直接切换到目标工作区目录。当您只需要操作单个包时,请避免使用 --workspaces:复数选项会选择所有已配置的工作区。实用的规则很简单:当您需要明确的目标时,从根目录使用 --workspace="path",并在 npm 完成后检查清单和代码仓库的更改。

来源