如果你不是一个项目的发起者,那么在日常的工作中大多数都是接手或者维护已经存在的项目,而它们都分散在不同 git 中并且是多人个在维护。但是你开发的业务又对它们有依赖,如果有发生依赖变动、那么更新依赖就是个繁琐的操作。所以我们可以借助 lernal & git submodule 来帮我创建一个工程 重点围绕 multirepo
多个依赖包进行管理。
lernal
用于本地多包依赖管理的工具,他有两个管理模式,固定模式和独立模式。 lerna.js.org/
独立模式比较适合 multirepo
管理,在这种模式下可以对每个 package 分别定义单独的版本号。
lerna init --independent
工程结构
root/
package.json
packages/
package-1/
package.json
package-2/
package.json
lerna.json
{
"version": "1.0.0",
"npmClient": "npm",
...
"packages": [
"packages/*"
]
}
具体相关的 lerna 使用我就不细说了,这里都有。
submodule
git submoudle 是一个很好的多 git 工具,它允许类库项目做为 repository 子项目做为一个单独的 git 项目存在父项目中,子项目可以有自己的独立的 commit
,push
,pull
。而父项目以 submodule 的形式包含子项目,父项目可以指定子项目 header,父项目中会的提交信息包含 submodule 的信息,再 clone 父项目的时候可以把 submodule 初始化。
1. 添加一个子模块
举个例子,我们在 packages/somecode 目录添加一个子模块库。
git submodule add https://something/somecode.git packages/somecode
执行命令之后,packages/
目录下多一个 somecode
项目,而且在 root/
目录下也会多出一个 .gitmodules
文件,该配置文件保存了相关的映射信息,如果有多个子模块那么也会有多个相关的配置。
[submodule "packages/somecode"]
path = packages/somecode
url = https://something/somecode.git
2. 删除一个子模块
git 不支持直接删除 submoudle 子模块,需要以下操作执行:
第一步 删除依赖
# 删除 submodule 以及依赖
git submodule deinit --force packages/something
# 删除本地 packages/ 下的文件
git rm -fr packages/something
第二步 删除 git 痕迹,先到 root/.git 目录中看一下如果有就删除
cd {project}/.git #project 进入到你项目下的 .git 目录
rm -fr ./modules/packages/something # 删除对应 submodule 的痕迹
第三步 检查一下 root/.git/config 文件是否还有依赖性。 最后别忘记 commit 和 push 相关的更改, 这样才算删除一个 submodule
本地项目依赖自动更新
npx lerna link
该命令会分析 packages/*
下每个模块的 package.json
文件,并且会在对应的 子模块/node_moudles
中创建 symlink (软链接) 从而达到本地 npm 包相互 link 的作用,只要相关的依赖包发生变更编译就会自动更新。
初始化 一个别人创建的 multirepo 工程
[npm|yarn|pnpm]
install (root 包 install)- git submodule update --force (每个子模块 clone 到本地)
- npx leran bootstrap (每个子模块 install)
- npx leran run build (执行每个子模块 package.json 中的 build 命令)
- npx leran link