npm 工作区 workspaces
使用工作区工作
描述
工作区(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"
属性。
向工作区添加依赖项
可以使用workspace
config直接添加/删除/更新工作区的依赖项。
例如,假设以下结构:
.
+-- package.json
`-- package
+--a
| `--package.json
`--b
`--package.json
如果要将abbrev
注册表中命名的依赖项添加为工作区a的依赖项,则可以使用工作区配置来告诉 npm 安装程序应将包添加为提供的工作区的依赖项:
npm 安装缩写 -wa
注:其他安装命令,例如uninstall
,ci
等也会尊重提供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