【问题标题】:Updating package references on multi-targeted projects更新多目标项目的包引用
【发布时间】:2021-12-22 22:42:15
【问题描述】:

我希望对一些需要编译为 .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。

<PropertyGroup>
    <TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="morelinq" Version="3.3.2" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.18" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.18" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.18" />
    <PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="3.1.18" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="6.0.0" />
</ItemGroup>

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

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

【问题讨论】:

    标签: .net visual-studio nuget-package visual-studio-2022


    【解决方案1】:

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

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

    接下来,您需要将所有匹配项替换为 &lt;TargetFrameworks&gt;netstandard2.0&lt;/TargetFrameworks&gt;,并更新 .NET Standard 2.0 特定的 NuGet 包引用。最后,您将执行另一个查找和替换以恢复到 &lt;TargetFrameworks&gt;netstandard2.0;net6.0&lt;/TargetFrameworks&gt;

    我一直保留&lt;TargetFrameworks&gt; 的复数形式,以将其与最初具有&lt;TargetFramework&gt; 的真正单一目标项目区分开来。您可能希望使用其他方法来跟踪这些临时的查找和替换更改,例如添加&lt;!-- revert --&gt; 评论。

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2015-12-11
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多