更新多目标项目的包引用

142*_*973 6 .net visual-studio nuget-package visual-studio-2022

我希望对一些需要编译为 .NET Standard 2.0(对于旧版 .NET Framework 4.8 项目)和 .NET 6.0(对于新项目)的常见项目使用多目标。这些常见项目的一些依赖项需要有条件地引用。例如,.NET Standard 2.0 目标需要保留在 Entity Framework Core 3.1 上,而 .NET 6.0 目标可以使用 Entity Framework Core 6.0。

\n\n
<PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>\n</PropertyGroup>\n\n<ItemGroup>\n    <PackageReference Include="morelinq" Version="3.3.2" />\n    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />\n</ItemGroup>\n\n<ItemGroup Condition=" \'$(TargetFramework)\' == \'netstandard2.0\' ">\n    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.18" />\n    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.18" />\n    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.18" />\n    <PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="3.1.18" />\n</ItemGroup>\n\n<ItemGroup Condition=" \'$(TargetFramework)\' == \'net6.0\' ">\n    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />\n    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.0" />\n    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" />\n    <PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="6.0.0" />\n</ItemGroup>\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,我在使用 Visual Studio“管理 NuGet Packages\xe2\x80\xa6”功能更新包时遇到问题,因为它似乎不支持目标框架。这会影响 Visual Studio 的所有版本,包括 2022:

\n

管理 NuGet 包

\n

是否有正确的方法来处理多目标项目的包升级?

\n

142*_*973 4

到目前为止,我发现的最佳解决方法是<TargetFrameworks>在更新 NuGet 包时使用解决方案范围的查找和替换来临时将 csproj 文件中的 更改为单个目标。

\n

例如,您可以首先替换所有出现的<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>to <TargetFrameworks>net6.0</TargetFrameworks>。通过此更改,<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">组中的任何包引用都将被忽略,并且 Visual Studio“管理 NuGet 包\xe2\x80\xa6”窗口将允许您仅更新常见的和 .NET 6.0\xe2\x80\x93 特定的 NuGet 包引用。(您可能需要在替换后重新加载所有项目,例如通过重新启动 Visual Studio。)

\n

接下来,您将替换所有出现的内容<TargetFrameworks>netstandard2.0</TargetFrameworks>并更新 .NET Standard 2.0\xe2\x80\x93 特定的 NuGet 包引用。最后,您将执行另一次查找和替换以恢复为<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>.

\n

我保留了贯穿的复数形式,<TargetFrameworks>以将其与最初具有<TargetFramework>. 您可能希望使用其他方法来跟踪这些临时查找和替换更改,例如添加注释<!-- revert -->

\n