monorepo
管理代码的一个方式, 指的是在一个仓库里管理多个模块/包 package
monorepo最主要的好处就是统一的工作流和代码共享
Lerna是管理多个npm模块的工具 优化维护多包的工作流, 解决多个包之间相互依赖, 且发布需要手动维护多个包的问题
packages = (packageA + packageB + packageC) 一个仓库下有多个包
-
MultiRepo多仓管理方式
- 优点:
- 各个模块管理自由度比较高, 可自行选择构建工具, 依赖管理, 单元测试等配套设施
- 各模块仓库体积一般不会太大
- 缺点:
- 仓库分散不太好找, 很多的时候, 分支管理混乱
- 版本更新频繁, 如果公共模块发生了变化的时候, 需要对所有的模块进行依赖的更新
- CHANGELOG梳理比较折腾, 无法很好地关联各个模块的变动联系, 基本靠口相传
- 优点:
-
MonoRepo的方法
- 缺点:
- 统一构建工具, 对构建工具提出了更高的要求, 要构建各种相关的模块
- 仓库体积变大
- 优点:
- 一个仓库维护多个模块, 不用到处寻找仓库
- 方便版本管理和依赖管理, 模块之间的引用, 调试都比较方便, 配合相应工具, 都可以使用一个命令搞定
- 方便统一生成CHANGELOG 配合提取规范, 可以在发布的时候自动生成
- 缺点:
-
使用mongoRepo
npm install lerna -g
lerna init
-
package.json
- private: true 表示是一个私有的项目, 不会发布到npm上
- workspaces 表示是一个yarn workspace的项目, 允许我们使用monoRepo的形式来管理项目
在安装node_modules的时候, 不会安装到每一个子项目的node_modules里面, 而是直接安装到根路径下面, 这样每一个子项目都可以读取到根项目里面的node_modules
整个项目只有根路径下面有一份yarn.lock文件, 子项目会被link到node_modules里面, 这样就允许我们可以直接使用import导入对应的项目
yarn.lock文件是自动生成的, 完全由yarn来处理, 锁定安装的每一个依赖的版本, 这样可以确保不会获得不良的依赖
-
lerna创建子项目
- lerna create create-react-app3
- lerna create react-script3
- lerna create cra-template3
// cra-template3.js const reactScripts = require("react-scripts2"); function craTemplate2() { console.log(reactScripts()); console.log("cra-template-2"); } craTemplate2(); module.exports = craTemplate2; // react-scripts2.js function reactScripts2() { // console.log('reactScripts2'); return "reactScripts2"; } module.exports = reactScripts2;
-
yarn管理项目
- yarn workspaces info查看工作空间
- yarn add chalk cross-spawn fs-extra@8.1.0 --ignore-workspace-root-check 忽略工作空间根检查
- 给公共空间安装依赖: yarn workspace create-react-app2 add commander