有几种方法可以做到这一点。目前(在进行本次编辑时),只有 NuGet 的中央包版本管理支持管理传递包依赖项。
手动,使用 .targets 文件
拥有一个 .targets 文件,其中包含您引用但使用的所有包<PackageReference Update=
代替Include=
。将其包含在 Directory.Build.targets 文件中,以便将其应用到每个项目文件的末尾。
这样做的最大缺点是,每当将新的 PackageReference 添加到任何项目时,您还需要记住更新 .targets 文件以包含更新该包版本的条目。
这将确保您的所有<PackageReference>
条目将统一为相同版本。不过,这并不影响及物的引用,即如果您有 Project1 -> Package1 -> Package2,但只有对 Package1 的 PackageReference,则您将无法影响 Package2 的引用版本。如果 Project2 -> Package2 的版本与 Package1 引用的版本不同,则可能会产生冲突。
使用中央包版本 MSBuild SDK (CPV)
手动过程可能容易出错,因此有第 3 方 SDK 来帮助使该过程更加顺利。您可以在以下位置找到它:中央包版本 https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions。这还强制要求用户不在项目中指定版本(因为他们应该使用中心版本!),因此它比使用手动技术更加一致。
这也不能以任何方式解决传递依赖问题。
使用 Nuget 中央包版本管理 (CPVM)
这是 NuGet 团队针对该问题的解决方案。它的解释是这篇博文 https://devblogs.microsoft.com/nuget/introducing-central-package-management/,或者您可以在以下位置找到原始文档:集中管理 NuGet 包版本 https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions.
在根文件夹中有一个名为 Directory.Packages.props 的文件,并通过添加以下内容来启用该功能:
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
现在,与 CPV SDK 类似,您应该从<PackageReference>
元素,并将它们放入<PackageVersion>
Directory.Packages.props 文件中的元素。如果您需要覆盖版本,有两种方法:
- On the
<PackageReference>
项目,添加一个VersionOveride=1.2.3.4
属性。
- 在.csproj中添加
<PackageVersion Update="PackageName" Version="DifferentVersion" />
(这是因为 Directory.Packages.props 是通过 .NET SDKs .props 文件导入的,这是在评估 .csproj 的内容之前)。
这本身对传递引用没有帮助。您还可以添加<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
启用传递包的固定。这基本上所做的是确定您的任何直接或间接(传递)PackageReferences是否具有匹配的PackageVersion,如果是的话,它会像直接引用一样提升它(意味着依赖于它的任何东西也将获得固定版本) 。传递固定支持至少需要 NuGet 6.2、VS 2022 17.2 或 .NET SDK 6.0.300。