【问题标题】:How to handle NuGet dependency version resolution for the whole solution如何处理整个解决方案的 NuGet 依赖版本解析
【发布时间】:2020-06-02 13:35:38
【问题描述】:

我正在寻找一种简单的方法来管理整个解决方案的 NuGet 包,以防止在将所有文件组装到一个安装程序中时传递 NuGet 包之间的冲突。

在构建项目时,会分析所有直接和间接依赖项,并且 NuGet 解析会为每个 NuGet 选择最佳匹配版本,该版本至少与最低版本相同,并且可能还会在必要时创建绑定重定向。 (一切都很好)

我们最近遇到的问题是,当我们一次构建整个解决方案(200 多个项目)时,所有顶级项目之间生成的 NuGet 版本可能并不相同。由于所有生成的 DLL 和 EXE 文件都安装到同一个程序文件文件夹中,因此应用程序可能并且将在运行时由于加载程序集时的版本不匹配而崩溃。

为了更好地理解这个问题,我创建了这个sample repo

依赖关系图如下所示:

  • 图书馆1
    • Microsoft.IdentityModel.Tokens-5.2.1
  • 可执行文件1
    • System.IdentityModel.Tokens.Jwt-5.3.0(传递参考:Microsoft.IdentityModel.Tokens-5.3.0
    • 图书馆1
    • 结果:Microsoft.IdentityModel.Tokens-5.3.0
  • 可执行文件2
    • Microsoft.IdentityModel.Tokens-5.2.1
    • 结果:Microsoft.IdentityModel.Tokens-5.2.1

为了演示问题,所有项目都编译到同一个 bin 文件夹。编译整个解决方案并启动 Executable2 时,应用程序崩溃,因为应用程序需要 Microsoft.IdentityModel.Tokens 版本为 5.2.1,但实际版本为 5.3.0。

对于这个构建的示例,很容易找到问题并通过将 Microsoft.IdentityModel.Tokens NuGet 更新到相同版本来修复它。 (手动,因为 Visual Studio 包管理器在 合并选项卡 中无法识别此冲突。

但在更大的范围内,要找到这些不匹配则要复杂得多。

到目前为止我们发现了什么

Centrally managing NuGet package versions

  • 由于尚不可用,因此无法用于解决此处的问题。

Microsoft.Build.CentralPackageVersions

  • 很遗憾,它没有 IDE 支持,这使得管理 NuGet 包非常不舒服,如果可能的话,我想避免这种情况。

所以我的问题是避免同一解决方案中项目之间的 NuGet 版本冲突的最佳方法是什么?

【问题讨论】:

  • 我们也有同样的问题。你有没有找到超越“Paket 包管理器”的解决方案?
  • 嗨@AlexI,很抱歉回复晚了。我们最终选择使用 CPVM,即使它仍处于预览阶段。我们不想使用 Paket,因为它的集成不如内置工具好。 CPVM 完成了它的工作,但不幸的是,他们从中删除了 .NET 5 中的传递固定,但可能会将其带回 .NET 6 中。根据您使用的框架,您也可以使用 CPVM 来解决这个问题。未解决的问题:github.com/NuGet/Home/issues/10389

标签: c# .net visual-studio nuget assembly-resolution


【解决方案1】:

我们的一些项目也遇到了同样的问题。几年来我们一直在使用Paket package manager,这已经为我们解决了这个问题。

简而言之:您在解决方案级别定义要在名为“paket.dependencies”的文件中使用的包。您可以非常具体地了解版本,或者让数据包使用最新的最大版本。然后,您可以在“paket.references”文件中为每个项目指定要在该项目中使用的 NuGet 包。顾名思义,您在 paket.dependencies 文件中引用了一个包。

这将确保您项目中的所有引用包都将使用相同的包版本。我希望这也能满足您的需求。

【讨论】:

  • 谢谢。这是否也适用于传递依赖?例如。如果有 NuGet A 和 NuGet B 并且都使用 NuGet C,但在不同的版本中,我是否需要在 paket 文件中明确声明 NuGet C,或者整个解决方案也能正确解决这个问题?
  • 是的。该过程在 GitHub 自述文件中进行了描述。 github.com/fsprojects/Paket
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2016-06-07
  • 2021-01-06
  • 2022-06-29
相关资源
最近更新 更多