首页 > 解决方案 > 如何使用来自构建服务器的项目引用来管理 Nuget 包依赖版本

问题描述

我有一个简单的项目依赖结构:

project A references project B

在我的构建服务器上,两个项目都构建为 Nuget 包:包 A 和包 B。

在项目 B 中,我将包版本手动设置为 2.0.0。当我在 Visual Studio 中测试构建项目 A 时,生成的 Nuget 包 A 依赖于版本 2.0.0 的包 B。这是期望的行为。

然而,在构建服务器上,我们需要自动递增版本号,以便用于构建项目 A 的 MSBuild 命令具有构建服务器/p:Version={version}确定{version}的任何版本号。

在 MSBuild 中使用/p:Version={version}开关会导致 Nuget 包 A 依赖于完全相同的包 B,{version}而不是 2.0.0。这是非常有问题的,因为我们需要控制 Nuget 包对特定版本的包 B 的依赖。

所以这里是我试图解决这个问题的所有事情,但它们都有其明显的缺点:

  1. 不是让项目 A 引用项目 B,而是引用项目 B 的 NuGet 包 - 包 B。

    在这种情况下,您会丢失项目引用,当您需要同时调试项目 A 和 B 时,这可能会很痛苦。

  2. 将项目 B 的程序集捆绑到包 A 中。

    所以包 A 对包 B 没有依赖关系。但是,因为项目 B 也被项目 C、D 和 E 引用。如果我对它们都这样做,所有包都将具有相同的项目 B 程序集。

    当所有包都被另一个项目引用时,它们会从项目 B 中覆盖彼此的程序集,因此其中一些可能会有旧版本的程序集覆盖新版本,从而导致无法预料的运行时问题。

  3. 让构建服务器更新Version项目 A 的项目文件中的元素:

    <PropertyGroup>    
      <Version>1.2.3</Version>
    </PropertyGroup>
    

    /p:Version={version}然后在没有开关的情况下运行 MSBuild 命令。

    但是,如果构建服务器更新并提交了我们源代码管理中的实际项目文件,这将触发构建服务器再次构建该项目,并进入无限循环。

这就是我现在所处的位置,如果可能的话,试图找到一个好的解决方案来满足以下标准:

  1. 构建服务器确定项目 A 和 B 的版本,并分别生成相应的 Nuget 包及其版本。
  2. 包 A 应该依赖于包 B 的正确版本,包 B 也是由构建服务器构建的。
  3. 项目 A 应将项目 B 作为常规项目参考。

有谁知道这是否可能?

标签: visual-studiomsbuildnugetnuget-packageproject-reference

解决方案


推荐阅读