前言
工作区是一个通用术语,它支持在单个顶层根包中管理本地文件系统中的多个包, 工作区是一种设置包架构的新方法,从 Yarn 1.0 开始默认可用。它允许你以这样的方式设置多个软件包,只需运行 yarn install 一次即可一次性安装所有软件包。
什么是Monorepo?
Monorepo
(单一仓库)是一种将多个相关项目的源代码存储在一个单一版本控制系统仓库中的策略。这种模式下,无论是微服务架构的后端服务,还是包含多个前端应用的大型项目,都可以共处一室,共享配置、依赖和工具链。Monorepo 的优势在于简化跨项目协作、代码复用、统一版本管理和 CI/CD 流程。然而,随之而来的是对版本控制系统的高效管理需求,以及如何处理大型仓库带来的构建速度问题。(后面会介绍)
为什么用它?
-
你的依赖可以链接在一起,这意味着你的工作区可以相互依赖,同时始终使用最新的可用代码。这也是比
yarn link
更好的机制,因为它只影响你的工作区树而不是整个系统。 -
所有项目依赖都将安装在一起
,为 Yarn 提供更多自由度来更好地优化它们。 -
Yarn 将使用单个锁定文件,而不是为每个项目使用不同的锁定文件,这意味着更少的冲突和更容易的审查。
如何使用它?
创建 yarn-workspace
, 执行yarn init -y
,初始化 package.json
, 设置根项目的 package.json
,
{
"private": true,
"workspaces": [
"packages/*" // 扫描packages目录,将项目纳入到workspace context中
]
}
-
private
:根目录一般是项目的脚手架,无需发布,“private”: true会确保根目录不被发布出去。
-
workspaces
:声明workspace中package的路径。值是一个字符串数组,支持Glob通配符。其中"packages/*"
是社区的常见写法,package也可以用其他什么名字,只是常规就这么写
创建 packages
文件夹,在 packages
下创建下面 两个文件夹, 分别在目录下执行 yarn init -y
, 这样就能生成各自的 package.json
.
+-- node_modules
+-- yarn-lock.json
+-- package.json
`-- packages
+-- v-cart`
| -- package.json
`+-- v-user`
| -- package.json
在根目录执行 yarn workspaces info --json
, 来查看结果,结果如下:
{
"v-cart": {
"location": "packages/v-cart",
"workspaceDependencies": [],
"mismatchedWorkspaceDependencies": []
},
"v-user": {
"location": "packages/v-user",
"workspaceDependencies": [],
"mismatchedWorkspaceDependencies": []
}
}
命令实例解释
命令模板:
yarn workspace <workspaceName> command <packageName> --xxx
workspaceName
: 指项目的package.json
中name
command
:add
,remove
,upgrade
,run
packageName
:例如 lodash-es
--xxx
:--dev , --peer 、 --optional
给项目添加包
// 给 v-cart 添加 lodash-es 包
yarn workspace v-cart add lodash-es --dev
// 运行 v-cart 的 dev 命令
yarn workspace v-cart run dev
全局操作(给顶层项目添加包)
1. 安装
yarn add rimraf -W -D
给每个包中添加 script
"del" : "rimraf node_modules"
2. 执行所有包中的相同命令 del
yarn workspaces run del
3. 查看信息
yarn workspaces info --json
代码地址
总结:
现在我们的项目功能是,每个项目拥有自己的包(与主版本不同的),相同的版本包进行提升至根目录
现在项目的使用步骤
git clone 项目地址
yarn
// 安装所有依赖yarn workspace v-cart run dev
// 运行具体命令yarn workspaces run del
// 删除所有工作区的node_module