【问题标题】:How to force downgrade a transative dependency in dotnet core如何强制降级 dotnet core 中的传递依赖
【发布时间】:2021-04-09 12:46:06
【问题描述】:

我的应用程序 A 依赖于 nuget 库 B 和 nuget 库 C 版本 1.1.1,在 csproj 中使用 PackageReference。

<PackageReference Include="B" Version="1.0.0" />
<PackageReference Include="C" Version="1.1.1" />

但是,库 B 依赖于库 C >= 1.1.2。

<PackageReference Include="C" Version="1.1.2" />

我无法将我的应用更改为在 C 版本 1.1.2 上运行,我知道 B 可以在 C 版本 1.1.1 上正常工作。

如何强制我的应用 A 使用 C 版本 1.1.1 运行?具体来说,我需要删除编译器错误 CS1705。以前在完整框架中我会使用绑定重定向,但我知道这些在 dotnet 核心中不可用。

A
- B
- C (v = 1.1.1)


B
- C (v >= 1.1.2)

【问题讨论】:

  • 为什么不能将应用更改为使用 C v. 1.1.2?库通常是向后兼容的。如果你不是 B 的作者,那可能是不可能的
  • 这个例子是一个实际问题的抽象一般案例,其中 A 在我无法完全控制运行时 (Azure Functions) 的托管环境中运行,其中 C v 1.1.2与A不兼容,我无法更改B或C的来源。知道这似乎有点武断,但它确实代表了实际问题的一般情况!
  • 那么您将不得不升级到更高版本的库,或者将其作为您的应用程序的依赖项删除并编写您自己的功能实现。什么的。

标签: c# .net-core nuget


【解决方案1】:

我不确定这是否能解决您的 CS1705 问题,但如果要为包 C 提供 1.1.1 的确切版本,那么您可以使用 Version Ranges

例如。 &lt;PackageReference Include="C" Version="[1.1.1]" /&gt;

您也可以尝试使用implicit versioning,让构建过程为您决定。您将从&lt;PackageReference /&gt; 中删除Version 属性

例如。 &lt;PackageReference Include="C" /&gt;

【讨论】:

  • 不错!重新启动 VS 后,NuGet 包管理器会遵守此表示法。例如,(4.5,5.0] 阻止它建议更新到 5.0。对于兼容性或许可问题很有用。如果您使用包管理器更新到 4.6,则不确定 XML 是否会被破坏。
  • @StackOverthrow 您应该能够只卸载并重新加载特定项目,而不是重新启动 Visual Studio。
  • 我刚刚对此进行了测试,虽然它似乎确实允许 nuget 还原完成,但只有一个警告你仍然得到构建错误 CS1705
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2019-11-04
  • 2022-01-03
  • 2021-10-08
  • 2021-07-26
  • 2012-10-09
相关资源
最近更新 更多