如何强制降级 dotnet core 中的传递依赖

Posted

技术标签:

【中文标题】如何强制降级 dotnet core 中的传递依赖【英文标题】:How to force downgrade a transative dependency in 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的来源。知道这似乎有点武断,但它确实代表了实际问题的一般情况! 那么您将不得不升级到更高版本的库,或者将其作为您的应用程序的依赖项删除并编写您自己的功能实现。什么的。 【参考方案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;

【讨论】:

另见docs.microsoft.com/en-us/dotnet/standard/library-guidance/… 不错!重新启动 VS 后,NuGet 包管理器会遵守此表示法。例如,(4.5,5.0] 阻止它建议更新到 5.0。对于兼容性或许可问题很有用。如果您使用包管理器更新到 4.6,则不确定 XML 是否会被破坏。 @StackOverthrow 您应该能够只卸载并重新加载特定项目,而不是重新启动 Visual Studio。 我刚刚对此进行了测试,虽然它似乎确实允许 nuget 还原完成,但只有一个警告你仍然得到构建错误 CS1705

以上是关于如何强制降级 dotnet core 中的传递依赖的主要内容,如果未能解决你的问题,请参考以下文章

如何在启动时使用 dotnet core 3 中的依赖项调用自定义服务?

如何将动态对象序列化为 dotnet core 中的 JSON 字符串?

为啥 Gradle 会降级 Grails 3.1 应用程序中的传递依赖项?

Visual Studio 2017 强制站点通过 https 加载,即使禁用了 ssl (Dotnet core 2.2)

DotNet Core 中 AuthorizationOptions 要求的依赖注入

如何通过父pom中的dependencyManagement强制maven依赖版本?