我真的很难弄清楚传递依赖的版本解析是如何在框架"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.App
将Microsoft.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/