阅读(2787) (9)

npm 工作区 workspaces

2021-09-16 15:00:36 更新

使用工作区工作

描述

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

这组功能弥补了从本地文件系统处理链接包的更加简化的工作流程。自动化链接过程作为一部分,npm install避免手动使用npm link以添加对应符号链接到当前node_modules文件夹的包的引用 。

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

定义工作区

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

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

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

.
+-- package.json
`--workspace-a
   `--package.json

一旦npm install在当前工作目录中运行,预期的结果.是该文件夹workspace-a将被符号链接到node_modules当前工作目录的 文件夹。 下面 是一个 postnpm install示例,考虑到与之前的文件和文件夹的示例结构相同:

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

开始使用工作区

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

npm init -w ./packages/a

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

向工作区添加依赖项

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

例如,假设以下结构:

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

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

npm 安装缩写 -wa

注:其他安装命令,例如uninstallci等也会尊重提供workspace配置。

使用工作区

鉴于Node.js 如何处理模块解析的特殊性,可以通过它的声明来使用任何定义的工作区package.json name。继续上面定义的示例,让我们还创建一个需要workspace-a 示例模块的 Node.js 脚本,例如:

// ./workspace-a/index.js
module.exports = 'a'


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

运行时:

node lib/index.js

这演示了node_modules分辨率的性质如何允许 工作区启用可移植的工作流,以要求每个工作区 以这样一种方式也很容易发布这些嵌套的工作区以供其他地方使用。

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

你可以使用workspace配置选项在已配置工作区的上下文中运行命令。

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

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

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

npm run test --workspace=a

这将运行文件中test定义的脚本 ./packages/a/package.json

请注意,你还可以在命令行中多次指定此参数以定位多个工作区,例如:

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

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

npm run test --workspaces

test./packages/a和 中运行脚本./packages/b

忽略丢失的脚本

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

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

npm run test --workspaces --if-present