如何强制降级 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。
例如。 <PackageReference Include="C" Version="[1.1.1]" />
您也可以尝试使用implicit versioning,让构建过程为您决定。您将从<PackageReference />
中删除Version
属性
例如。 <PackageReference Include="C" />
【讨论】:
另见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)