Microsoft.NETCore.App和Microsoft.NETCore.Platforms的传递依赖是如何工作的



我真的很难弄清楚传递依赖的版本解析是如何在框架"metapackages"中工作的。

我问这个问题的原因是,似乎每次我们拉进一个"老"字。依赖,例如指向netstandard2.0或2.1的东西,我们最终会得到一长串过时的包(这也是由我们的构建管道报告的)。

例如:

给出一个。net6类库,创建如下:

dotnet new classlib
dotnet add pakage System.Data.SqlClient

生成的csproj看起来像:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
</ItemGroup>
</Project>

看起来很好。我有最新的SqlClient和im在。net6 o/

现在当我执行dotnet list package --outdated --include-transitive

得到以下输出:

Project `Outdated` has the following updates to its packages
[net6.0]:
Transitive Package                       Resolved   Latest
> Microsoft.NETCore.Platforms            3.1.0      6.0.3
> Microsoft.Win32.Registry               4.7.0      5.0.0
> System.Security.AccessControl          4.7.0      6.0.0
> System.Security.Principal.Windows      4.7.0      5.0.0

据我所知,Microsoft.Win32.Registry是"共享框架"的一部分。并期望它使用最新版本。

谁能解释一下为什么不用最新的版本?或者,我如何强迫。net使用没有直接依赖的最新版本(如果可能的话-我再次试图避免一长串过时的临时依赖关系存在于共享框架中…)。

浏览各种NuGet/dotnet Github问题和讨论。NuGet恢复依赖的方式似乎是罪魁祸首。默认为满足所有需求的最低版本。

"meta"软件包实际上并不与SDK版本绑定,而是直接依赖于其他软件包,例如Microsoft.NETCore.AppMicrosoft.NETCore.Platforms作为2.2.4或更高版本。

由于System.Data.SqlClient是。net Core 3.1包,它引用Microsoft.NETCore.Platforms版本3.1.0(或更高版本)。

由于我的项目没有直接依赖于Microsoft.NETCore.Platforms,所以NuGet选择了最低的一个。

我仍然真的不明白为什么SDK参考没有导致直接依赖,但我猜推理已经淹没在一些GitHub问题讨论。

下面包含解析策略的描述:https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution#dependency-resolution-rules

长话短说-目前只能获得带有一长串特定依赖项的最新版本。

编辑

可能是使用中央包管理的变体:https://devblogs.microsoft.com/nuget/introducing-central-package-management/

相关内容

最新更新