如何在C#解决方案中实现多项目共享单个Git子模块副本?
在Git(GitHub)中实现SVN externals风格的同级依赖共享(Windows+Visual Studio环境)
场景与SVN下的现有方案
我们有多个C#项目,依赖多款共用C#类库,类库自身也存在依赖关系:比如应用A依赖类库X、Y,X和Y又都依赖类库Z;应用B、C、D也可能依赖X、Y、Z中的部分。
在Subversion(SVN)中这个场景处理起来很顺畅:
- 每个可复用类库对应独立仓库,分支根目录存放Visual Studio解决方案文件,各类项目(类库、测试等)在根目录下有独立文件夹。
- 类库若依赖其他仓库的类库,通过SVN externals将依赖类库的文件夹引入同级目录;使用类库的程序也在分支根目录通过SVN externals引入所需类库文件夹,解决方案仍放在根目录。
- 只需检出应用或类库的某分支,就能自动获取自身及所有依赖项目,可直接构建;且每个外部引用绑定特定版本,类库更新不会影响依赖项目的构建。
举个例子:
- 检出应用A的分支后,工作副本包含A的解决方案文件、A项目文件夹,以及X、Y、Z类库项目文件夹,可直接构建。
- 检出类库X的分支后,工作副本包含X的解决方案、X项目及Z项目文件夹,同样可直接构建。
需求与当前Git submodule的问题
现在需要在Git(托管于GitHub)、Windows+Visual Studio环境下实现上述效果。
我们了解Git submodule,但默认用法无法满足需求:当应用(或类库)仓库包含多个子模块,且这些子模块依赖同一公共子模块时,克隆后的工作副本会出现嵌套重复的依赖。
默认submodule生成的结构:
- A (solution) |- A (project) |- X (project) |- Z (project) |- Y (project) |- Z (project)
(X、Y各包含独立的Z副本)
我们期望的结构:
- A (solution) |- A (project) |- X (project) |- Y (project) |- Z (project)
(每个依赖仅存一份,所有项目文件夹同级)
要求与疑问
- 优先使用所有客户端支持的标准Git特性,仅特定Windows客户端支持的方案也可接受。
- 强烈排斥克隆后执行脚本创建链接等方案,理想状态下克隆操作可一步完成所有文件的正确部署(源代码及项目文件直接在工作副本中,而非NuGet包形式)。
由于之前查阅的相关问题多较陈旧,想了解Git近年更新是否提供了更优雅的解决方案?
内容的提问来源于stack exchange,提问作者reirab
相关产品推荐
相关产品推荐

