Skip to content

多项目模块共用的方式——npm包git submodule

前言

在项目开发中,我们经常会遇到多个项目共用同一个模块的情况。比如,多个项目都使用了同一个UI库,或者都使用了同一个工具库。这时候,我们就需要考虑如何共用这些模块。

1. 使用npm包

很多项目都会使用npm包,比如reactvuelodash等。在公司内部开发的项目中涉及到共用的部分,可以考虑使用npm包的方式。在公司内部搭建的npm私有库,公用的模块可以发布到私有库中,然后其他项目通过npm install 的方式安装。在发布npm的时候推荐使用fatherfather可以自动生成npm包的文档,并且可以自动生成npm包的类型文件。

也可以使用ice pkgice pkgicejsnpm包管理工具,可以自动生成npm包的文档,并且可以自动生成npm包的类型文件。

关于如何发布到内部的npm私有包,已经提供了两个方式,可以选看看相关文档,这里就不赘述了。后面会详细介绍如何发布到内部的npm私有包。

2. 使用git submodule

git submodule 是git 的一个功能,可以用来管理多个git仓库之间的关系。在项目开发中,如果多个项目都使用了同一个模块,可以考虑使用git submodule 的方式。

如果有一个模块只是自己团队内部使用,可以考虑使用git submodule 的方式。而且这个模块项目更新还比较频繁,可以考虑使用git submodule 的方式。这样就不用频繁的发布npm包了。来看下使用git submodule 的方式。

原理

子模块就是一个内嵌到其他仓库中的git仓库。有自己的git提交记录,有自己的分支,有自己的tag。而引用这个子模块的仓库,可以像使用普通模块一样使用子模块。

使用

比如有两个项目主项目main-project 和公共模块项目sub-module

添加子模块

main-project 根目录中,执行以下命令把公共模块sub-module 添加到主项目中的src/sub-module 目录中。

bash
// 添加子模块
git submodule add https://github.com/your-username/sub-module.git src/sub-module

然后用git status看下有以下修改

  • 新增了.gitmodules 文件
  • 新增了src/sub-module 目录
  • .git目录新增了/modules/src/sub-module 目录

拉取子模块更新

  1. main-project 根目录中,执行以下命令拉取子模块更新
bash
// 拉取子模块更新
git submodule update --remote

如果有多个子模块,以上命令会拉取所有子模块更新。如果只想拉取某个子模块更新,可以执行以下命令

bash
// 拉取某个子模块更新
git submodule update --remote --submodule-path src/sub-module
  1. main-project 根目录中,进入src/sub-module 目录,执行以下命更新
bash
git pull

拉取包含公共模块的更新

如果主项目main2-project引用了公共模块项目sub-module,然后需要使用git clone 拉取主项目main2-project,那么需要使用git clone --recurse-submodules或者使用git clone --recursive 命令拉取主项目main2-project,这样会自动拉取公共模块项目sub-module。如果不加--recurse-submodules或者--recursive 命令,那么公共模块项目sub-module不会被拉取,只有一个空的文件夹。

bash
// 拉取包含公共模块的更新
git clone  https://github.com/your-username/main2-project.git --recurse-submodules

如果在git clone的时候,没有使用--recurse-submodules或者--recursive 命令,也可以在主项目main2-project 根目录中,执行以下命令拉取公共模块项目sub-module

bash
// 初始化公共模块项目`sub-module`
git submodule init

// 更新公共模块项目`sub-module`
git submodule update

// 或者合并以上两个命令,拉取公共模块项目`sub-module`
git submodule update --init

修改子模块

进入 src/sub-module 目录,修改子模块后按照常规方式进行提交即可。

WARNING

注意:如果同时修改了子模块和父模块,需要先提交子模块再提交父模块,原因是 git 子模块的机制实际上只是存储了我们子模块仓库的一个索引,所以它表现为一个文件,而子模块目录里的文件不会被提交到主模块仓库中,它会将子模块当前分支最新提交作为一个提交记录,提交到主模块去。

删除子模块

在主项目main-project 根目录中,执行以下命令删除子模块

bash
// 移除子模块前需要先取消注册,即删除子模块相关的配置文件
git submodule deinit sub-module

// 恢复删除
git submodule update --init sub-module

但此时配置文件仍未被删除,如需彻底删除需要手动删除以下文件

  • 删除子模块对应的目录:src/sub-module
  • 删除 .gitmodules 中子模块 sub-module 对应的区块配置
  • 删除 .git/config 目录下的子模块 sub-module
  • 删除子模块的缓存 git rm --cached sub-module

总结

  • 如果公共模块项目更新频繁,可以考虑使用git submodule 的方式。
  • 如果公共模块项目更新不频繁,并且共用的范围比较大,比如公司内部多个项目和多个团队都使用,可以考虑使用npm包的方式。

如有转载或 CV 的请标注本站原文地址