工作区

使用工作区

选择 CLI 版本

描述

工作区 是一个通用术语,指的是 npm cli 中的一组功能,这些功能支持从本地文件系统中的单个顶级根包内管理多个包。

这组功能为处理来自本地文件系统的链接包提供了更简化的工作流程。它在 npm install 的过程中自动执行链接过程,并消除了手动使用 npm link 来添加对应该符号链接到当前 node_modules 文件夹的包的引用。

我们还将这些包在 npm install 期间自动符号链接称为单个 工作区,这意味着它是在当前本地文件系统内显式定义在 package.json workspaces 配置中的嵌套包。

定义工作区

工作区通常通过 package.json 文件的 workspaces 属性来定义,例如

{
"name": "my-workspaces-powered-project",
"workspaces": ["packages/a"]
}

鉴于上面的 package.json 示例位于当前工作目录 .,该目录包含一个名为 packages/a 的文件夹,该文件夹本身包含一个 package.json,定义了一个 Node.js 包,例如

.
+-- package.json
`-- packages
+-- a
| `-- package.json

在当前工作目录 . 中运行 npm install 后,预期结果是文件夹 packages/a 将被符号链接到当前工作目录的 node_modules 文件夹。

以下是在运行 npm install 之后的示例,假设之前示例的文件和文件夹结构相同

.
+-- node_modules
| `-- a -> ../packages/a
+-- package-lock.json
+-- package.json
`-- packages
+-- a
| `-- package.json

工作区入门

您可以使用 npm init 自动执行定义新工作区所需的步骤。例如,在已经定义了 package.json 的项目中,您可以运行

npm init -w ./packages/a

此命令将创建缺失的文件夹和一个新的 package.json 文件(如果需要),同时还确保正确配置根项目 package.json"workspaces" 属性。

向工作区添加依赖项

可以使用 workspace 配置 直接添加/删除/更新工作区的依赖项。

例如,假设以下结构

.
+-- package.json
`-- packages
+-- a
| `-- package.json
`-- b
`-- package.json

如果您要从注册表添加名为 abbrev 的依赖项作为工作区 a 的依赖项,可以使用工作区配置来告诉 npm 安装程序将该包添加为提供的依赖项工作区

npm install abbrev -w a

注意:其他安装命令(如 uninstallci 等)也同样尊重提供的 workspace 配置。

使用工作区

鉴于 Node.js 如何处理模块解析的细节,可以按其声明的 package.json name 来使用任何已定义的工作区。继续上面的示例,我们还将创建一个 Node.js 脚本,它将需要工作区 a 的示例模块,例如

// ./packages/a/index.js
module.exports = 'a'
// ./lib/index.js
const moduleA = require('a')
console.log(moduleA) // -> a

使用以下命令运行它

node lib/index.js

这演示了 node_modules 解析的性质如何允许 工作区 为以易于 发布 这些嵌套工作区以便在其他地方使用的方式来要求每个 工作区 启用便携式工作流程。

在工作区上下文中运行命令

您可以使用 workspace 配置选项在已配置工作区的上下文中运行命令。此外,如果您的当前目录位于工作区中,则 workspace 配置将被隐式设置,并且 prefix 将被设置为根工作区。

以下是如何在嵌套工作区的上下文中使用 npm run 命令的快速示例。对于包含多个工作区的项目,例如

.
+-- package.json
`-- packages
+-- a
| `-- package.json
`-- b
`-- package.json

通过使用 workspace 选项运行命令,可以在该特定工作区的上下文中运行给定命令。例如

npm run test --workspace=a

您也可以在工作区内运行该命令。

cd packages/a && npm run test

两者都将运行 ./packages/a/package.json 文件中定义的 test 脚本。

请注意,您也可以在命令行中多次指定此参数,以针对多个工作区,例如:

npm run test --workspace=a --workspace=b

或者在“packages”文件夹中为每个工作区运行命令:

npm run test --workspace=packages

也可以使用 workspaces(复数)配置选项来启用相同行为,但在**所有**配置的工作区上下文中运行该命令。例如:

npm run test --workspaces

将在 ./packages/a./packages/b 中运行 test 脚本。

命令将在每个工作区中按照它们在 package.json 中出现的顺序运行。

{
"workspaces": [ "packages/a", "packages/b" ]
}

运行顺序与

{
"workspaces": [ "packages/b", "packages/a" ]
}

忽略丢失的脚本

所有工作区都不需要实现使用 npm run 命令运行的脚本。

通过使用 --if-present 标志运行命令,npm 将忽略缺少目标脚本的工作区。

npm run test --workspaces --if-present

另请参阅