
多项目模块共用的方式——npm包
、git submodule
前言
在项目开发中,我们经常会遇到多个项目共用同一个模块的情况。比如,多个项目都使用了同一个UI库,或者都使用了同一个工具库。这时候,我们就需要考虑如何共用这些模块。
1. 使用npm包
很多项目都会使用npm包,比如react
、vue
、lodash
等。在公司内部开发的项目中涉及到共用的部分,可以考虑使用npm包的方式。在公司内部搭建的npm私有库,公用的模块可以发布到私有库中,然后其他项目通过npm install
的方式安装。在发布npm的时候推荐使用father,father
可以自动生成npm包的文档,并且可以自动生成npm包的类型文件。
也可以使用ice pkg,ice pkg
是icejs
的npm
包管理工具,可以自动生成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
目录
拉取子模块更新
- 在
main-project
根目录中,执行以下命令拉取子模块更新
bash
// 拉取子模块更新
git submodule update --remote
如果有多个子模块,以上命令会拉取所有子模块更新。如果只想拉取某个子模块更新,可以执行以下命令
bash
// 拉取某个子模块更新
git submodule update --remote --submodule-path src/sub-module
- 在
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
包的方式。