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

时间:2014-12-11 21:41:26

标签: .net visual-studio-2012 tfs nuget

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

CustomLibrarySolution
|
|--CustomLibrary.Mvc
|--CustomLibrary.Persistence
|--CustomLibrary.Persistence.NHibernate

每个项目都有NuGet依赖项,在最初的CustomLibrary开发时,将软件包版本更新到最后一个,看起来像这样(为简单起见,一些库):

CustomLibrarySolution
|
|--CustomLibrary.Mvc [NuGet: log4net 1.2]
|--CustomLibrary.Persistence
|--CustomLibrary.Persistence.NHibernate [NuGet: NHibernate 3.0]

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

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

项目构建正常,运行正常;但我怀疑这不是基于:

  • packages的{​​{1}}文件夹包含2个版本文件夹
My2ndProject
  • 当我使用 Reflector.NET 等工具检查其中一个NHibernate 3.0 NHibernate 4.0 log4net 1.2 log4net 1.3 程序集时,它显示了两个依赖项(NHibernate 3.0和NHibernate 4.0)。例如,这让我很难尝试使用InstallUtil安装Windows服务,因为它会抛出一个AssemblyLoadException来搜索NHibernate 3.0。

我正在考虑这种情况,并且我已经达成的一个可行解决方案是每次在新项目中使用它们时复制类库项目,而不是仅复制dll。这将允许将类库NuGet依赖项更新为与新项目中引用完全相同的版本。 这种方法的问题是我们将丢失类库的TFS版本。相反,该库将存在于N个存储库中。

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

1 个答案:

答案 0 :(得分:3)

您的项目2直接依赖于NHibernate 4.0和&#34;传递&#34;依赖于NHibernate 3.0(通过库)。至少这是我在与人们讨论这个问题时使用的术语。

我写了一篇关于这个问题的博客文章,以及在此解决它的策略:http://geekswithblogs.net/Optikal/archive/2013/01/27/151951.aspx

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

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

以下是有关如何指定版本控制政策的nuget文档:http://docs.nuget.org/docs/reference/versioning

这是一篇关于如何让NuGet为您生成绑定重定向的精彩博文:http://blog.davidebbo.com/2011/01/nuget-versioning-part-3-unification-via.html