Bha*_*anu 14 c# nuget nuget-package-restore .net-6.0 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>
Run Code Online (Sandbox Code Playgroud)
Jim*_*mmy 14
有几种方法可以做到这一点。目前(在进行本次编辑时),只有 NuGet 的中央包版本管理支持管理传递包依赖项。
拥有一个 .targets 文件,其中包含您引用的所有包,但使用<PackageReference Update=而不是Include=. 将其包含在 Directory.Build.targets 文件中,以便将其应用到每个项目文件的末尾。
这样做的最大缺点是,每当将新的 PackageReference 添加到任何项目时,您还需要记住更新 .targets 文件以包含更新该包版本的条目。
这将确保您的所有<PackageReference>条目都统一为相同版本。但是,它不会影响传递引用,即,如果您有 Project1 -> Package1 -> Package2,但只有对 Package1 的 PackageReference,则您将无法影响 Package2 的引用版本。如果 Project2 -> Package2 的版本与 Package1 引用的版本不同,则可能会产生冲突。
手动过程可能容易出错,因此有一个第 3 方 SDK 可以帮助使该过程更加顺利。您可以在Central Package Versions中找到它。这还强制要求用户不在项目中指定版本(因为他们应该使用中心版本!),因此它比使用手动技术更加一致。
这也不能以任何方式解决传递依赖问题。
这是 NuGet 团队针对该问题的解决方案。这篇博文对此进行了解释,或者您可以在集中管理 NuGet 包版本中找到原始文档。
在根文件夹中有一个名为 Directory.Packages.props 的文件,并通过添加以下内容来启用该功能:
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
现在,与 CPV SDK 类似,您应该从元素中删除所有版本<PackageReference>,并将它们放入<PackageVersion>Directory.Packages.props 文件中的元素中。如果您需要覆盖版本,有两种方法:
<PackageReference>项目上添加VersionOveride=1.2.3.4属性。<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。
提到了新的 CPM 功能,但我想我也应该提供一个完整的示例。
您可以使用 nuget 的新“中央包管理”功能。
假设您有包含多个项目的 monorepo(即 VS“解决方案”或 VSCode“工作区”)。
ProjectA.csproj:
<ItemGroup>
<PackageReference Include="Foo.Bar.Baz" Version="1.0.0" />
<PackageReference Include="Spam.Ham.Eggs" Version="4.0.0" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
ProjectB.csproj:
<ItemGroup>
<PackageReference Include="Foo.Bar.Qux" Version="1.2.3" />
<PackageReference Include="Spam.Ham.Eggs" Version="4.5.6" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
有些项目是相同的,而另一些则不同。并且您需要记住保持版本同步 - 该示例表明您忘记了这样做!
ProjectA.csproj:
<ItemGroup>
<PackageReference Include="Foo.Bar.Baz" />
<PackageReference Include="Spam.Ham.Eggs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
ProjectB.csproj:
<ItemGroup>
<PackageReference Include="Foo.Bar.Qux" />
<PackageReference Include="Spam.Ham.Eggs" Version="4.0.0" /> <!-- note version override for this project -->
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
Directory.Packages.props到存储库的根目录中<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<!-- use 'PackageVersion' rather than 'PackageReference' -->
<PackageVersion Include="Foo.Bar.Baz" Version="1.2.3" />
<PackageVersion Include="Foo.Bar.Qux" Version="1.2.3" />
<PackageVersion Include="Spam.Ham.Eggs" Version="4.5.6" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
对于每个项目:
dotnet cleandotnet restore您的所有项目现在都将使用您在配置文件中指定的版本。
还有更多选项,例如版本覆盖和传递依赖固定 - 阅读文档了解更多信息。
| 归档时间: |
|
| 查看次数: |
13580 次 |
| 最近记录: |