考虑一个.NET Core应用程序(A
),该应用程序使用B
模型引用第三方nuget程序包(PackageReference
)。软件包B
自己依赖于另一个软件包(C
):
A -> B -> C
包B
声明对C
的依赖,版本约束为>= 1.0.0
。 A
没有C
的编译时用法,也没有直接引用它-C
是传递性的运行时依赖项。
但是,软件包C
的1.0.0版本(由构建程序拾取)中存在一个错误。该错误已在较新的版本中修复,并以次要版本(例如v1.1.0)递增的形式发布到nuget。
默认情况下,我的版本不采用此最新版本。我认为这是由于“最低适用版本”规则所致,如下所述: https://docs.microsoft.com/en-us/nuget/concepts/dependency-resolution#dependency-resolution-rules
建议强制采用哪种方法来强制内部版本获取软件包C
的错误修复1.1.0版本?
一种解决方案是显式引用C
中软件包A
的1.1.0版本。但是,这感觉就像我在破坏封装,因为A
不需要了解关于C
的任何信息。
理想情况下,软件包B
的作者将更新对C
的依赖以使用更新的版本,但是我对此软件包没有任何控制权。
我还尝试在解决方案的根目录使用Directory.Build.props
文件,以尝试强制在整个解决方案中更新版本:
<ItemGroup>
<PackageReference Update="SomePackage.C" Version="1.1.0" />
</ItemGroup>
...但是这不起作用(我认为“最低适用版本”规则仍然适用)。如果您使用Include
而不是Update
,它确实有效,但这只是将软件包安装到解决方案中的所有项目中。
我希望能够为构建过程提供一些“策略”,以强制选择更新的版本,但是我还没有找到一种方法。
注意:我的实际示例比此处概述的示例更为复杂。 B
和C
都是广泛使用的Microsoft ASP.NET程序包,C
出现在依赖关系图中的许多位置(我自己的应用程序从未直接引用该代码)。>