我很难弄清楚传递依赖项的版本解析如何适用于框架“元包”。
我问的原因是,似乎每次我们引入“旧”依赖项时,例如指向netstandard2.0或 2.1 的东西,我们最终都会得到一长串过时的包(这再次由我们的构建管道报告) 。
举个例子:
给定一个 .net6 类库,创建如下:
dotnet new classlib
dotnet add pakage System.Data.SqlClient
Run Code Online (Sandbox Code Playgroud)
生成的 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>
Run Code Online (Sandbox Code Playgroud)
看来这样还好啊。我有最新的 SqlClient 和 .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
Run Code Online (Sandbox Code Playgroud)
据我所知,Microsoft.Win32.Registry它是“共享框架”的一部分,并且预计它会使用最新版本。
谁能解释一下为什么它不使用最新版本?或者,我如何强制 dotnet 使用最新版本而无需直接依赖(如果可能的话 - 我再次尝试避免共享框架中存在的一长串过时的瞬态依赖项...)。
浏览各种 NuGet/dotnet Github 问题和讨论。看来 NuGet 恢复依赖关系的方式是罪魁祸首。它默认为满足所有要求的最低版本。
事实上,“元”包并不与 SDK 版本绑定,而是直接依赖于其他包,例如Microsoft.NETCore.App目标Microsoft.NETCore.Platforms版本2.2.4或更高版本的包。
由于System.Data.SqlClient是 .NET Core 3.1 包,因此它指的是Microsoft.NETCore.Platforms版本3.1.0(或更高版本)。
由于我的项目没有直接依赖 well 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/
| 归档时间: |
|
| 查看次数: |
823 次 |
| 最近记录: |