【发布时间】: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