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

标签 .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

项目构建正常,运行良好;但我怀疑这不行,因为:

  • My2ndProjectpackages 文件夹包含 2 个版本文件夹
NHibernate 3.0
NHibernate 4.0
log4net 1.2
log4net 1.3
  • 当我使用 Reflector.NET 之类的工具检查其中一个 My2ndProject 程序集时,它显示了两个依赖项(NHibernate 3.0 和 NHibernate 4.0)。例如,这让我在尝试使用 InstallUtil 安装 Windows 服务时感到头疼,因为它在搜索 NHibernate 3.0 时抛出 AssemblyLoadException。

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

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

最佳答案

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

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

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

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

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

这里有一篇很棒的博客文章,介绍如何让 NuGet 为您生成绑定(bind)重定向:http://blog.davidebbo.com/2011/01/nuget-versioning-part-3-unification-via.html

关于.net - 如何在 Visual Studio 2013/TFS 中管理类库演变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27432917/

相关文章:

c# - 如何安全地运行不受信任的第三方代码?

c# - 如何向存储过程提供参数

c++ - 在 Visual Studio C++ 中设置 PYTHONPATH 环境变量

c# - 项目集合构建服务锁定我的文件

c# - 给定两个日期时,检查在一个时间范围内是否花费了至少两个小时

C#:函数中的函数可能吗?

c - Visual Studio 2012 中的 WinAPI 文档

c - 处理功能

tfs - 如何为自定义 MSBuild 任务设置 "Version control path to custom assemblies"

tfs - TFS 在哪里存储源代码以及如何访问它?