Skip to content
微信公众号

Monorepo架构

什么是Monorepo

Monorepo是一种代码组织思想,它要求我们只用一个代码仓库来管理一个大项目的所有资源、子项目,简单来说交易前放在多个repo里的代码现在就放在一个repo就行了。

Multirepo(传统多repo项目)会将一个项目按照职责、业务模块进行拆分,然后创建不同的代码仓库进行管理。不同的团队可以专注于负责某一个代码仓库代码提交、编译、发布。

Lerna

Lerna是一个管理工具,用于管理包含多个软件包(package)的javaScript项目,使用git和npm管理多软件包代码仓库工作流程进行优化。

安装

shell
npm install -g lerna

初始化仓库/项目

shell
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结构初始化

js
# 参数 --independent/i 使用独立版本控制模式,默认是fix模式

# Fixed/Locked mode(default):默认固定模式下所有包的主版本号和次版本都会使用lerna.json配置里的version字段定义的版本号

每次publish时,将得到一个提示符,提示每个已更改的包,已指定是补丁、次要更改、主要更改还是自定义更改

如果某一次只修改了其中一个或几个包,但修改了配置文件里的主版本号或次版本号,那么发布时所有的包都会统一升级到该版本并进行发布

单个的包如果想要发布只能修改修订版本号进行发布

# independent mode独立版本模式:每个包使用独立的版本号

# 每次publish时,您都将得到一个提示符,提示每个已更改的包,以指定是补丁、次要更改、主要更改还是自定义更改。

lerna init --independent | lerna init -- i

lerna create [package name]

创建子项目包

js
-y 子项目走默认初始化配置

lerna add

增加本地或者远程package作为当前项目packages里面的依赖

js
# 安装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

安装各个子项目的声明的依赖,并通过软连接的方式处理子项目间的依赖㽑

js
--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中声明对应的回调以执行需要的过程。

js
特点: 会打tag,上传git,上传npm。

如果你的包名是带scope的例如:`"name": "@owljs/test"`,那需要再package.json添加

"publishConfig":{
    "access": "public"
}

lerna run

运行某个包的某个指令

js
lerna run <script> -- [..args] #运行所有包里面的这个script的指令
lerna run --scope my-component test

lerna clean

清空所有子项目的node_modules,会提问我们是否继续,选择yes

lerna changed

列出下次发版lerna publish要更新的包

lerna list

列出所有的包

lerna exec

运行任意命令在每个包

js
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
js
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即可实现相同功能。

js
# 集成yarn workspace
# package.json
{
    "name": "root",
    "private": true,
    "devDenpendencies":{
        "lerna": "^4.0.0"
    },
    "workspaces":["packages/*"]
}
js
# lerna.json

{
    "packages":[
        "packages/*"
    ],
    "version": "independent", //独立版本
    "npmClient": "yarn", //默认npm
    "useWorkspaces": true
}
js
# 清理环境
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安装依赖

本站总访问量次,本站总访客数人次
Released under the MIT License.