在之前尝试将项目中使用到的 lerna 升级到 v6 时发现,使用 lerna bootstrap 初始化项目时报错:bootstrap 等 npm 内置支持的几个命令已经不再可用。因为从 npm@7.x 开始引入了 workspaces 功能,它允许你在一个单一的仓库中组织和管理多个相关的 npm 包,从而简化了多包项目的开发和维护。
主要功能
- 集中管理依赖:可以在根目录的
package.json中定义所有包的依赖,避免重复安装。 - 跨包引用:可以轻松地在工作区内的包之间引用和依赖。
- 统一脚本执行:可以在根目录执行脚本,自动在所有子包中运行。
其中第1点替代了 lerna bootstrap 的能力,在项目根目录执行 npm install 时,npm 会同时安装根目录和子包的所有依赖,并且会根据规则将子包共同依赖的包安装在项目根目录,同时会将每个子包都以 npm link 的方式安装到项目根目录。 这样有以下几个优势:
- 避免重复安装:各子包共同的依赖项集中安装在项目根目录,可以减少各子包重复在各自目录重复安装,因为 node.js 等模块管理工具在引用 npm 包的时候,是自下而上查找的方式。
- 方便子包跨包依赖:各子包相互依赖也不需要安装了,会直接引用到通过 npm link 到根目录 node_modules 中的子包。
如何使用
创建工作区
首先,创建一个新的项目目录,并在其中初始化一个新的 npm 项目:
1 | |
配置 package.json
在根目录的 package.json 中添加 workspaces 字段,指定工作区的包路径:
1 | |
创建子包
在 packages 目录下创建多个子包:
1 | |
安装依赖
在根目录运行 npm install,npm 会自动安装所有子包的依赖,并在根目录创建一个统一的 node_modules 目录。
跨包引用
在子包的 package.json 中,可以通过 workspace: 前缀来引用其他子包,也可以直接写其他子包的最新版本,lerna 在执行 lerna version 命令时会自动更新依赖的版本:
1 | |
运行脚本
可以在根目录运行脚本,npm 会自动在所有子包中执行:
1 | |
结合 lerna
lerna 从 4.0 开始支持 npm workspaces 功能,从而简化了依赖管理和脚本执行。但其它方面比如修改版本及发版方面还是可以使用 lerna 来完成。具体的使用可以参考:4a-bdp-draw 或 4a-bdp-common 代码库。
