.net 如何在Visual Studio 2013/TFS中管理类库演变?

.net 如何在Visual Studio 2013/TFS中管理类库演变?,.net,visual-studio-2012,tfs,nuget,.net,Visual Studio 2012,Tfs,Nuget,我们开发了一个类库来帮助我们的开发过程。此库包含一个包含3个不同项目/程序集的解决方案: CustomLibrarySolution | |--CustomLibrary.Mvc |--CustomLibrary.Persistence |--CustomLibrary.Persistence.NHibernate 每个项目都有NuGet依赖项,在最初的CustomLibrary开发时,这些依赖项将包版本更新到最后一个版本,看起来像这样(为了简单起见,有几个库): 因此,我们使用此库创建了第一

我们开发了一个类库来帮助我们的开发过程。此库包含一个包含3个不同项目/程序集的解决方案:

CustomLibrarySolution
|
|--CustomLibrary.Mvc
|--CustomLibrary.Persistence
|--CustomLibrary.Persistence.NHibernate
每个项目都有NuGet依赖项,在最初的CustomLibrary开发时,这些依赖项将包版本更新到最后一个版本,看起来像这样(为了简单起见,有几个库):

因此,我们使用此库创建了第一个项目,解决方案如下所示:

MyFirstProject
|--Libs
   |--CustomLibrary.Mvc.dll [NuGet: log4net 1.2]
   |--CustomLibrary.Persistence.dll
   |--CustomLibrary.Persistence.NHibernate.dll [NuGet: NHibernate 3.0]
|--MyFirstProject.Web [CustomLibrary.Mvc.dll AND NuGet: log4net 1.2]
|--MyFirstProject.Core [CustomLibrary.Persistence.dll]
|--MyFirstProject.Core.NHibernate [CustomLibrary.Persistence.NHibernate.dll 
                                   AND NuGet: NHibernate 3.0]
一切都很顺利

现在,在我们的第二个项目中,我为什么写这篇文章的问题出现了:

My2ndProject
|--Libs
   |--CustomLibrary.Mvc.dll [NuGet: log4net 1.2]
   |--CustomLibrary.Persistence.dll
   |--CustomLibrary.Persistence.NHibernate.dll [NuGet: NHibernate 3.0]
|--My2ndProject.Web [CustomLibrary.Mvc.dll AND NuGet: log4net 1.3] <-- newer version
|--My2ndProject.Core [CustomLibrary.Persistence.dll]
|--My2ndProject.Core.NHibernate [CustomLibrary.Persistence.NHibernate.dll 
                                 AND NuGet: NHibernate 4.0] <-- newer version
  • 当我使用类似于Reflector.NET的工具检查这个
    My2ndProject
    程序集时,它显示了两个依赖项(NHibernate 3.0和NHibernate 4.0)。例如,尝试使用InstallUtil安装windows服务会让我头疼,因为它会抛出AssemblyLoadException搜索NHibernate 3.0
我在考虑这种情况,我已经找到了一个可行的解决方案,就是每次在新项目中使用类库项目时都复制它们,而不是只复制DLL。这将允许将类库NuGet依赖项更新为与新项目中引用的版本完全相同的版本。 这种方法的问题是我们将丢失类库的TFS版本控制。相反,该库将存在于N个存储库中


我可以做些什么来改进这种方法吗?

您的项目2直接依赖于NHibernate 4.0,并且(通过库)依赖于NHibernate 3.0。至少这是我和人们谈论这个问题时使用的术语

我在这里写了一篇关于这个问题的博客文章,以及解决这个问题的策略:

其要点是,您需要为各种组件制定一个版本控制策略,并使用程序集绑定重定向来解决无法将多个版本加载到同一进程中的问题

幸运的是,NuGet基本上为您完成了所有艰苦的工作(根据策略找出一个可接受的版本,并创建绑定重定向),您只需在各种nuspec文件中指定版本控制策略

以下是有关如何指定版本控制策略的nuget文档:


这里有一篇关于如何让NuGet为您生成绑定重定向的博文:

为什么不使用一组依赖项?这种混乱通常会很快失控。你的意思是在第二个项目中,使用NHibernate 3.0而不是NHibernate 4.0,对吗?以更理想的为准。我认为使用较新的版本更好,所以我会升级库。将依赖项的多个版本加载到同一进程中不是一个好主意。最终,您确实只希望将每个外部库的一个版本加载到进程中,以避免各种版本不匹配问题。处理一组依赖项要简单得多。好吧,但这就是问题所在。如果我升级类库,那么我必须升级第一个项目的依赖项,如果我想修复或改进类库的错误。这种NuGet版本配置就是我想要的。非常感谢你
My2ndProject
|--Libs
   |--CustomLibrary.Mvc.dll [NuGet: log4net 1.2]
   |--CustomLibrary.Persistence.dll
   |--CustomLibrary.Persistence.NHibernate.dll [NuGet: NHibernate 3.0]
|--My2ndProject.Web [CustomLibrary.Mvc.dll AND NuGet: log4net 1.3] <-- newer version
|--My2ndProject.Core [CustomLibrary.Persistence.dll]
|--My2ndProject.Core.NHibernate [CustomLibrary.Persistence.NHibernate.dll 
                                 AND NuGet: NHibernate 4.0] <-- newer version
NHibernate 3.0
NHibernate 4.0
log4net 1.2
log4net 1.3