如何使用 Visual Studio 2022 为解决方案中的所有项目全局管理 nuget 包?
How to manage nuget packages globally for all projects in a solution using Visual Studio 2022?
我有一个使用 Visual Studio 2022 在 .NET 6.0 中创建的解决方案,它有很多项目。
每个项目在 .csproj 文件中都有很多 nuget 包引用,如下所示。
是否可以在解决方案中的单个位置/全局管理所有 nuget 包(而不是针对每个项目)?
这将确保解决方案中的所有项目都使用相同版本的包(相同 nuget 包的项目之间不再有版本冲突)。
在中心位置更新包一次将确保所有项目都引用相同的更新版本。无需为每个项目更新包。
感谢您的帮助。
<ItemGroup>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="10.0.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.20.0" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="2.0.2" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes.HostingStartup" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.1" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="5.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="6.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.1" />
<PackageReference Include="System.Collections" Version="4.3.0" />
<PackageReference Include="System.Runtime" Version="4.3.1" />
</ItemGroup>
有几种方法可以做到这一点。目前(在本次编辑时),只有 NuGet 的中央包版本管理支持管理传递包依赖项。
手动,使用 .targets 文件
拥有一个包含您引用的所有包的 .targets 文件,但使用 <PackageReference Update=
而不是 Include=
。将其包含在您的 Directory.Build.targets 文件中,以便在每个项目文件的末尾应用它。
这样做的最大缺点是,每当将新的 PackageReference 添加到任何项目时,您还需要记住更新 .targets 文件以包含更新该包版本的条目。
这将确保您的所有 <PackageReference>
条目将统一为相同的版本。但是,它不会影响 transitive 引用,即如果您有 Project1 -> Package1 -> Package2,但只有 Package1 的 PackageReference,您将无法影响引用的版本包 2。如果 Project2 -> Package2 的版本与 Package1 引用的版本不同,这可能会产生冲突。
使用中心包版本 MSBuild SDK (CPV)
手动过程可以是 error-prone,因此有一个第 3 方 SDK 可以帮助使过程更顺畅。您可以在 Central Package Versions 找到它。这也提供了用户不在项目中指定版本的强制措施(因为他们应该使用中央版本!)所以它比使用手动技术更一致。
这也不能以任何方式解决传递依赖问题。
使用 Nuget 中央包版本管理 (CPVM)
这是 NuGet 团队针对该问题的解决方案。 this blog post, or you can find the original documentation at Centrally managing NuGet package versions.
中对此进行了解释
在您的根文件夹中有一个名为 Directory.Packages.props 的文件,并通过添加以下内容启用该功能:
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
现在,与 CPV SDK 类似,您应该从 <PackageReference>
元素中删除所有版本,并将它们放入 Directory.Packages.props 文件的 <PackageVersion>
元素中。如果你需要覆盖一个版本,有两种方法:
- 在
<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。
我有一个使用 Visual Studio 2022 在 .NET 6.0 中创建的解决方案,它有很多项目。
每个项目在 .csproj 文件中都有很多 nuget 包引用,如下所示。
是否可以在解决方案中的单个位置/全局管理所有 nuget 包(而不是针对每个项目)?
这将确保解决方案中的所有项目都使用相同版本的包(相同 nuget 包的项目之间不再有版本冲突)。
在中心位置更新包一次将确保所有项目都引用相同的更新版本。无需为每个项目更新包。
感谢您的帮助。
<ItemGroup>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="10.0.1" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.20.0" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes" Version="2.0.2" />
<PackageReference Include="Microsoft.ApplicationInsights.Kubernetes.HostingStartup" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.1" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="5.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="6.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.1" />
<PackageReference Include="System.Collections" Version="4.3.0" />
<PackageReference Include="System.Runtime" Version="4.3.1" />
</ItemGroup>
有几种方法可以做到这一点。目前(在本次编辑时),只有 NuGet 的中央包版本管理支持管理传递包依赖项。
手动,使用 .targets 文件
拥有一个包含您引用的所有包的 .targets 文件,但使用 <PackageReference Update=
而不是 Include=
。将其包含在您的 Directory.Build.targets 文件中,以便在每个项目文件的末尾应用它。
这样做的最大缺点是,每当将新的 PackageReference 添加到任何项目时,您还需要记住更新 .targets 文件以包含更新该包版本的条目。
这将确保您的所有 <PackageReference>
条目将统一为相同的版本。但是,它不会影响 transitive 引用,即如果您有 Project1 -> Package1 -> Package2,但只有 Package1 的 PackageReference,您将无法影响引用的版本包 2。如果 Project2 -> Package2 的版本与 Package1 引用的版本不同,这可能会产生冲突。
使用中心包版本 MSBuild SDK (CPV)
手动过程可以是 error-prone,因此有一个第 3 方 SDK 可以帮助使过程更顺畅。您可以在 Central Package Versions 找到它。这也提供了用户不在项目中指定版本的强制措施(因为他们应该使用中央版本!)所以它比使用手动技术更一致。
这也不能以任何方式解决传递依赖问题。
使用 Nuget 中央包版本管理 (CPVM)
这是 NuGet 团队针对该问题的解决方案。 this blog post, or you can find the original documentation at Centrally managing NuGet package versions.
中对此进行了解释在您的根文件夹中有一个名为 Directory.Packages.props 的文件,并通过添加以下内容启用该功能:
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
现在,与 CPV SDK 类似,您应该从 <PackageReference>
元素中删除所有版本,并将它们放入 Directory.Packages.props 文件的 <PackageVersion>
元素中。如果你需要覆盖一个版本,有两种方法:
- 在
<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。