神策原来的前端项目都是多模块分repo的代码组织方式,导致开发比较繁琐,大量的时间花在了切分支,提mr,打tag,改版本号这些操作上,还时时容易出错,于是最近利用git submodule 把SPS的多个模块聚合在一起开发,并加入了一些批量脚本尽可能让大家能感受到和 monorepo 一样的开发体验。
http://gitlab.internal.sensorsdata.cn/sps/components/sps_submodule
这个仓库是一个利用git submodule聚合多个子模块的仓库,它的作用是帮助提高 SPS 的开发体验和效率,目标是尽量有 monorepo 一样的开发效率。
SPS 一共有12个子模块,目前加入常用的 5 个子仓库,通俗的话就是加入了五个仓库指针,每个子仓库的任何改动和提交都需要提到原有仓库,不影响之前的提交记录。
初始化和更新所有的子模块:
|
这样就可以获取所有子模块的最新代码。以后你只在这里就可以维护所有模块了。避免了多次切换仓库,修改,提交,提mr的痛苦。
git submodule是一种在一个git仓库中引用另一个git仓库的方法。它可以让你在一个项目中使用另一个项目的代码,同时保持两个项目的提交历史分开。git submodule只跟踪特定的提交,不跟踪分支或标签,也不会自动更新。
相互依赖性管理困难:老旧项目中的子模块可能已经有相互依赖关系,并且它们之间的版本和依赖关系可能比较复杂。将这些子模块合并到一个 monorepo 中会增加相互依赖性管理的复杂度,可能需要重新调整和解决依赖关系。
维护历史提交记录的需求:利用 git submodule,每个子模块都保留了自己的提交历史记录,这对于追溯和管理每个子模块的变更非常重要。如果使用 monorepo 的方式,子模块的提交历史记录将被混合在一起,导致难以区分和管理各个子模块的变更历史。
额外的测试成本: 老项目改成 monorepo 是有风险的特别是有些依赖关系的改动,这种改动是需要额外的测试成本。SPS已经进入维护阶段,git submodule 这种侵入性小的方案反而优势巨大。
如果你经常需要对所有子模块执行相同的git命令,比如切换分支,提交代码等,你可以使用git submodule foreach
命令来批量操作。为了方便起见,你可以给这个命令加一个别名,比如:
|
这样你就可以用git sfe
来代替git submodule foreach
了。
或者加入 .zshrc 中
|
可以用 gits
代替 git submodule foreach
如果你想对所有子模块执行相同的git命令,你可以使用git submodule foreach
命令来批量操作。比如,如果你想切换到test/1.8.1分支,你可以这样做:
|
如果你想提交所有子模块的修改,你可以这样做:
|
注意,这些命令只会影响本地的子模块,如果你想推送到远程仓库,你还需要执行:
|
或者:
|
产品意义上的版本和每个模块的版本是不一致的,我们日常的开发就是每个模块去看,去tag列表上找最新的tag然后再到本地从tag切出分支,重复进行此操作,十分繁琐还容易出错。这里也准备了一个脚本和一个产品版本和模块版本的对应关系的JSON。
|
node ./newBranch.js 产品版本号
选择需要切出的模块。
这样你就可以开始在一个聚合项目开发了。
目前写一个提交mr的脚本,可以批量给每个仓库提交mr。
|
是否为所有子模块提交合并请求
或者选择部分子仓库提交
脚本会自动判断每个子仓库当前分支和目标分支是有差异,没有差异则跳过此模块
最后会为你选择的每个模块创建MR,复制链接放到群里就可以开始review了。
其它设置(可选):在 mr.js 中,可以修改以下配置
|
ci 自动化,目前mr和测试分支推到各模块后会自动跑测试ci,还需要手动改APP中package的版本,后续可以把这一步集成一下,减少人力负担。
近期文章: