Monorepo架构
什么是Monorepo
Monorepo是一种代码组织思想,它要求我们只用一个代码仓库来管理一个大项目的所有资源、子项目,简单来说交易前放在多个repo里的代码现在就放在一个repo就行了。
Multirepo(传统多repo项目)会将一个项目按照职责、业务模块进行拆分,然后创建不同的代码仓库进行管理。不同的团队可以专注于负责某一个代码仓库代码提交、编译、发布。
Lerna
Lerna是一个管理工具,用于管理包含多个软件包(package)的javaScript项目,使用git和npm管理多软件包代码仓库工作流程进行优化。
安装
npm install -g lerna
初始化仓库/项目
git init lerna-repo
cd lerna-repo
lerna init
常用命令行
lerna publish
lerna version
lerna bootstrap
lerna list
lerna changed
lerna diff
lerna exec
lerna run
lerna init
lerna add
lerna clean
lerna create
lerna init
对当前项目进行lerna结构初始化
# 参数 --independent/i 使用独立版本控制模式,默认是fix模式
# Fixed/Locked mode(default):默认固定模式下所有包的主版本号和次版本都会使用lerna.json配置里的version字段定义的版本号
每次publish时,将得到一个提示符,提示每个已更改的包,已指定是补丁、次要更改、主要更改还是自定义更改
如果某一次只修改了其中一个或几个包,但修改了配置文件里的主版本号或次版本号,那么发布时所有的包都会统一升级到该版本并进行发布
单个的包如果想要发布只能修改修订版本号进行发布
# independent mode独立版本模式:每个包使用独立的版本号
# 每次publish时,您都将得到一个提示符,提示每个已更改的包,以指定是补丁、次要更改、主要更改还是自定义更改。
lerna init --independent | lerna init -- i
lerna create [package name]
创建子项目包
-y 子项目走默认初始化配置
lerna add
增加本地或者远程package作为当前项目packages里面的依赖
# 安装module1 作为module的业务依赖
lerna add module-1 --scope module-2
# 安装module1作为module的开发依赖
lerna add module-1 --scope module-2 --dev
# 安装module1作为所有子项目的依赖,除了module1自身
lerna add module-1
# 向所有的子项目中安装babel-core
lerna add babel-core
lerna bootstrap
安装各个子项目的声明的依赖,并通过软连接的方式处理子项目间的依赖㽑
--hoist 来将依赖安装到根目录已达成子项目共享node_modules
lerna version
这个命令会甄别出自上次发布版本依赖现有各子项目的git本地提交(统一管理一个待发布版本的提交信息),并针对这些代码更新进行npm package.json版本号的递增(子项目有修改才会递增,无则忽略)。修改changelog、创建git release tag、创建提交并推送到git服务器。
lerna publish
需要先npm login
运行这个命令会发布所有子项目git现在未发布的提交到npm(这个命令内部同时也会执行lerna version一样的操作)。这个命令会触发npm发布相关的生命周期函数,可以在lerna.json中声明对应的回调以执行需要的过程。
特点: 会打tag,上传git,上传npm。
如果你的包名是带scope的例如:`"name": "@owljs/test"`,那需要再package.json添加
"publishConfig":{
"access": "public"
}
lerna run
运行某个包的某个指令
lerna run <script> -- [..args] #运行所有包里面的这个script的指令
lerna run --scope my-component test
lerna clean
清空所有子项目的node_modules,会提问我们是否继续,选择yes
lerna changed
列出下次发版lerna publish要更新的包
lerna list
列出所有的包
lerna exec
运行任意命令在每个包
lerna exec -- <command> [..args] # runs the command in all packages
lerna exec -- rm -rf ./node_modules
lerna exec -- protractor conf.js
lerna exec --scope my-component -- ls -la
git remote add origin https://gitee.com/xxx/xxx.git
git push -u origin "master"
yarn和lerna有很多重复工作
yarn负责依赖管理
lerna负责打包发布
yarn workspace是Yarn提供的monorepo下,管理依赖的机制。对代码仓库下,多个package的依赖,进行管理:将共同的依赖,做hosting(提升)。这样,可以防止package的包重复安装。workspace机制,会在根目录下,统一安装依赖到node_module,并生成yarn.lock。单个package下,不需要再生成yarn.lock。
当使用lerna + yarn worksapce时,lerna的--hoist会被禁用,我们直接使用yarn install即可实现相同功能。
# 集成yarn workspace
# package.json
{
"name": "root",
"private": true,
"devDenpendencies":{
"lerna": "^4.0.0"
},
"workspaces":["packages/*"]
}
# lerna.json
{
"packages":[
"packages/*"
],
"version": "independent", //独立版本
"npmClient": "yarn", //默认npm
"useWorkspaces": true
}
# 清理环境
lerna clean #清理所有的node_modules
yarn worksapces run clean # 执行所有的package的clean操作
#安装依赖
yarn install 等价于lerna bootstrap --npm-client yarn --use-workspaces
给某个package安装依赖
# 将packageA作为packageB的依赖进行安装
yarn workspace packageB add packageA
lerna add packageB --scope packageA
给所有的package安装依赖
使用yarn workspace add lodash 给所有的package安装依赖
给root安装依赖:一般的公用的开发工具都是安装在root里,如typescript,我们使用yarn add -W -D typescript来给root安装依赖