我想集中指定最低 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包,应该是:
Case 3 在我定义时失败
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
在 Directory.x.props 文件之一中,我收到 NU1605 Detected Package Downgrade 错误(或警告,取决于错误配置)。 但是包 JsonB(案例 3)应该使用版本 13.0.3,没有在项目中明确指定传递依赖。
这可能吗,如果,怎么办?
我终于找到了它,就最低版本而言,使用中央包管理 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 包中创建一个依赖项,即使在不需要的地方也是如此。