我们遇到了类似的问题,并且非常像@Toby Allen 在他的回答中提到的那样,通过客户规范来解决它。然而,随着时间的推移,这变得非常痛苦(随着客户规范变得越来越复杂,建立新的团队成员变得越来越困难;自动化也更加复杂,因为事情......“不断变化”:-))。
最终,我们改进了我们的策略,改为使用目录结构和分支。目录结构如下:
//depot
/products
/(product_name)
/doc
/lib
/(3rd_party_libname)
(DLLs)
/(another_3rd_party_libname)
(DLLs)
/src
/Project1
(files, csproj, vbproj, etc)
/Project2
(files, csproj, vbproj, etc)
/Project3
(files, csproj, vbproj, etc)
Solution1.sln (includes src/Project1)
Solution2.sln (includes src/Project1, src/Project2)
Solution3.sln (includes src/Project1, src/Project3)
/(another_product_name)
/doc
/lib
/src
(solutions)
/shared
/(shared_lib_name)
/doc
/lib
/src
(solutions)
/(another_shared_lib_name)
/doc
/lib
/src
(solutions)
请注意,在整个结构中重复相同的结构 (doc/lib/src/solutions)。Lib 包含“外部”库 - 项目引用中包含的第 3 方库。Src 包含属于特定产品的所有项目的平面列表。然后使用解决方案以多种方式“组合”项目。我将 src 目录视为具有“可用内容”的容器,然后从该容器中挑选解决方案并组合项目(根据需要)。
在多个产品之间共享的库进入共享目录。一旦进入共享目录,它们就被视为独立于产品——它们有自己的发布周期,并且永远不会作为源加入产品。通过将共享库发布程序集/程序集分支到产品的lib目录中,将共享库拉入产品 -> 从产品的角度来看,第 3 方库和共享库之间没有区别。这使我们能够控制哪些产品正在使用哪个版本的共享库(当产品需要新功能时,它必须明确分支到共享库的新版本中,就像它包含新版本的第 3 方库一样,以及随之而来的所有优点和缺点)。
总之,我们的结构有两种“类型”共享库的概念:
- 产品本地的项目,由多个解决方案使用(包含在 src 目录中的平面项目列表中,多个解决方案可以引用它们)
- 多个产品使用的项目(添加到共享目录,被视为具有独立于产品版本的第 3 方库)