monorepo-不同包管理器workspace的使用方法
resolutionmulti repositories
在日益复杂的需求下,单一仓库已经不能满足团队开发的需求。多仓库聚合开发模式由此诞生,此笔记主要记录不同包管理器(npm、yarn、pnpm)下workspace的使用方式及功能
Npm
npm自7.x版本以后支持workspace
package.json配置
json
{ "name": "xxx", "workspaces": [ "namespace-a", "namespace-b" ]}
npm install
之后所有包下的依赖都会被软连接symlink到顶层的node_modules
workspace使用
js
// namespace-amodule.exports = 'a';
// ./lib/index.jsconst moduleA = require('namespace-a');console.log(moduleA); // a
workspace相关命令行语句
shell
// 创建workspace,前提确保pakcage.json中workspaces是否配置npm init -w ./packages/b
// 安装依赖至对应workspacenpm install xxx -w namsapce-a
// 运行指定workspace脚本npm run dev --workspaces // 运行全部npm run dev --workspace=namespace-a // 运行单个npm run dev --workspace=namespace-a --workspace=namespace-b // 按次序运行多个
// 使用--if-present忽略不存在执行脚本的模块npm run dev --workspaces --if-present
Yarn
package.json配置
package.json
json
{ "private": "true", "workspaces": [ "namespace-a", "namespace-b" ]}
Note:因为monorepo并不会对外暴露,所以private是必须的。
workspace使用
namespace-a/package.json
json
{ "name": "namespace-a", "version": "1.0.0", "dependencies": { "package-a": "1.0.0" }}
namespace-b/package.json
json
{ "name": "namespace-b", "version": "1.0.0", "dependencies": { "package-a": "1.0.0", "namespace-a": "1.0.0" }}
当运行yarn install
时,所有workspace
下的子项所有依赖都会集中在根工作区的node_modules
中,根据依赖关系最终结构如下:
text
/node_modules/node-modules/package-a/node-modules/namespace-a -> /namespace-a
workspace相关命令行语句
shell
// 执行对应子项命令yarn workspace workspaceName commandName
// 安装依赖到指定子项yarn workspace workspaceName add -D react
// 在所有子项上执行命令yarn workspaces foreach commandName
// 列出所有工作区yarn workspaces list
lerna是建立在yarn底层实现的高级功能工具,通常搭配使用
Pnpm
pnpm作为新一代包管理器,其symlink
非扁平式的node_modules嵌套结构使得每一个包只会被'安装一次',使得内盘容量和开发效率大大提升
pnpm.workspace.yaml
yaml
packages: - "apps/*" - "libs/*"# - ***
影响workspace的相关配置
npm.rc
yaml
# 将本地包连接到node_moduleslink-workspace-packages=true# 优先使用工作目录的package,只有save-workspace-protocal=false时有效prefer-workspace-packages=false# 共享lock文件,有利于模块解析shared-workspace-lockfile=true# 用来控制依赖在package.json中的版本范围save-workspace-protocol=true# 递归执行是否作用在根工作区include-workspace-root=false
workspace相关命令
shell
// 安装至根工作区的package.jsonpnpm add -w -D xxx