NuGet包,定义通用最低版本,允许更高?

问题描述 投票:0回答:1

我想集中指定最低 NuGet 包版本,以排除易受攻击的传递依赖项,但也允许更高版本,如果其他包需要作为传递依赖项。

我正在 Visual Studio 2022 中尝试新的中央包管理 (CPM),在解决方案级别使用 Directory.Packages.props 文件: https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution https://devblogs.microsoft.com/nuget/introducing-central-package-management/

或者,我可以使用 Directory.Build.props 或旧的 packages.config.

packages.config中它看起来像:

<package id="Newtonsoft.Json" version="13.0.1" allowedVersions="13.0.0" />

使用 allowedVersions="13.0.0" 允许一切 13.0.0 或更高版本。

行为,对于项目中引用的NuGet包,应该是:

  1. Package JsonA 具有传递性 Newtonsoft.Json 12.0.1 => 获取 13.0.1
  2. 项目需要Newtonsoft.Json 13.0.3(更新,项目中的新版本)
  3. Package JsonB 需要传递 Newtonsoft.Json 13.0.3 => 项目应更新到 13.0.3

Case 3 在我定义时失败

<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />

Directory.x.props 文件之一中,我收到 NU1605 Detected Package Downgrade 错误(或警告,取决于错误配置)。 但是包 JsonB(案例 3)应该使用版本 13.0.3,没有在项目中明确指定传递依赖。

这可能吗,如果,怎么办?

visual-studio package nuget version
1个回答
1
投票

我终于找到了它,就最低版本而言,使用中央包管理 CPM,如上链接(VS2022 17.2+,NuGet 6.2+)。

对于Newtonsoft.Json,它看起来像这样。 在 Directory.Packages.props 文件中(新的 CPM):

    <PropertyGroup>
        <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
        <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
    </PropertyGroup>

TransitivePinning 使 NuGet 为传递依赖拉取声明的版本,即使他们声明了另一个版本。

然后是 PackageVersion 元素。这 only 指定版本,not 将包添加到所有项目。实际上,可能根本不会使用 PackageVersion 声明。

<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />

在项目文件中,没有Version属性:

<PackageReference Include="Newtonsoft.Json" />

可以通过VersionOverride属性在项目级别引用其他版本。

自动升级到更高版本,例如当依赖项需要 Newtonsoft.Json 13.0.4 时,not 是否工作并且必须手动编辑。 PackageVersion Version 属性可能,截至目前,不包含浮动版本(*通配符,范围符号)。

与旧Directory.Build.props的区别:

那个只有 PackageReference 元素;在解决方案级别添加一个会在解决方案创建的每个 NuGet 包中创建一个依赖项,即使在不需要的地方也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.