在.net中应该是如此简单的东西似乎很难。
我有一个名为MyExtenders的项目,其中包含一些对基本类型的简单扩展。
许多项目使用MyExtenders-因此,在传统的svn检出和构建方法中,我将MyExtenders添加为svn:external,其修订版锁定至上次构建和测试的版本。
现在,如果我有两个都需要将MyExtenders添加到同一解决方案的项目,那么它们全都属于一个堆。我不能将两个MyExtenders都添加到解决方案中-所以我只能使用其中一个-如果版本不同,则意味着用它重新测试较旧的项目。
图表可能最好地解释了依赖性:
SolutionA
->ProjectA
->->MyExtenders r350 (svn:externed by ProjectA)
->ProjectB
->->MyCryptography r800 (svn:externed by ProjectB)
->->->MyExtenders r800 (svn:externed by MyCryptography)
Delphi / C可以很好地使用上述内容-所有引用均来自其自己的项目文件夹。
VS坚持要丢失目录结构,并将其扁平化为:
SolutionA
->ProjectA (refers MyExtenders)
->ProjectB (refers MyCryptography)
->MyCryptography r800 (refers MyExtenders)
->MyExtenders r350 || r800 - my choice
而且我被迫修改项目中的一个以引用不同的MyExtenders,并引用另一个版本。
显然我做错了所有..但是您怎么做对呢?
最佳答案
确实没有解决办法:如果您有两个不同的项目,取决于同一程序集的不同版本,那么无论如何管理项目间的依赖关系,都必然会有冲突。要了解为什么会发生这种情况,请想象可以通过某种方式解决您所有的源冲突-现在,部署后您将如何处理?加载哪个版本的依赖关系?无论是哪种方式,都可能会破坏需要其他版本的依赖程序集。
如果您的设计需要在各个子系统之间共享一个库,并且这些子系统处于同一流程中(从技术上来说,这是相同的AppDomain),则您的两个子系统都必须具有相同的程序集版本。
如果可以使依赖程序集由边界(例如服务接口或远程通道)分隔,则此问题将消失。然后,您可以独立地对依赖项进行版本控制。但是,Visual Studio不喜欢在一个解决方案中有两个具有相同名称的项目,因此解决此问题的唯一方法是复制一个项目文件,将其重命名,然后将其加载到解决方案中。