【问题标题】:dotnet restore warning NU1701dotnet 恢复警告 NU1701
【发布时间】:2017-12-05 06:51:16
【问题描述】:

我正在使用带有 C# 的 .NET Core,当我使用 dotnet restore 时,它给出了以下错误:

PS C:\workspace\Arbitrator> dotnet restore

C:\workspace\Arbitrator\Arbitrator.csproj:警告 NU1701:使用“.NETFramework,Version=v4.6.1”而不是项目目标框架“.NETCoreApp,Version=v2”恢复包“PusherClient 0.5.0”。 0'。这可能会导致兼容性问题。 C:\workspace\Arbitrator\Arbitrator.csproj:警告 NU1701:使用“.NETFramework,Version=v4.6.1”而不是项目目标框架“.NETCoreApp,Version=v2.0”恢复包“WebSocket4Net 0.14.1”。这可能会导致兼容性问题。

这个有问题的包是PusherClient。我只是按照 NuGet 文档来导入它。如何解决此警告?

【问题讨论】:

    标签: c# .net nuget .net-core


    【解决方案1】:

    对于 .NET Core 1.x:

    您需要告诉 PusherClient 的人,让他们的项目 .NET-Core 准备就绪。

    【讨论】:

    • 是什么让库没有准备好 .NET-Core?已经在 nuget.org 了,所以我觉得可以用吗?
    • @fluter PusherClient 是一个 .Net 框架库。要在 .Net Core 1.x 上使用它,需要将其更改为 .Net Standard 1.x 库。
    • @fluter 不过according to MS是.NET Core 2.0版本的新特性,可以参考.NET Framework 4.6.1(及以下)库。
    【解决方案2】:

    您不必等到 PusherClient 为 .NET Core 升级。

    从 .NET Core 引用 .NET Framework 4.6.1(及更低版本)是自 .NET Core/Standard 2.0 预览版 2 / VS 2017 预览版 15.3 起可用的 new feature,根据 MS,它可以是被认为是一项功能,可帮助您随着时间的推移将 .NET Framework 代码迁移到 .NET Standard 或 .NET Core。

    1. 你可以直接取消这个警告

      • 针对特定包
       <PackageReference Include="Contoso.Base.API" Version="1.0.3">
           <NoWarn>NU1701</NoWarn>
       </PackageReference>
      
      • 适用于所有软件包
       <NoWarn>NU1701</NoWarn>
      

      See scenarios 2 and 3 in NuGet wiki for ways to do it from GUI.

      但是,您的应用程序可能会在运行时失败 当您调用不受支持的 API(如 WPF 中的某些内容)时 通过 .NET 核心。失败的另一个原因可能是原生 API 可能由 PusherClient 使用。所以你应该广泛地测试它。 但在大多数情况下,它只适用于 .NET Core 的所有平台 支持(例如,我测试了一个应用程序 MathNet.Numerics 依赖项,它在 Linux 上运行,即使 MathNet.Numerics 也是 .NET Framework 4.6.1)。

    2. 如果您不需要您的应用是跨平台的,只需将以下内容添加到您的 csproj 文件中,将其目标框架更改为 .NET 4.6.1:

       <TargetFramework>net461</TargetFramework>
      

    【讨论】:

    • 是否可以禁止此类警告?
    • 是的,将 NU1701 放入你的 csproj
    • 在.csproj 文件中看不到抑制每个PackageReference 警告的方法。我确实在这个主题上找到了一个未解决的问题:github.com/NuGet/Home/issues/5740。投你的票:)
    【解决方案3】:

    附带说明,不要这样做:

    <PropertyGroup>
      <NoWarn>NU1701</NoWarn>
    </PropertyGroup>
    

    这样做会破坏在其他地方获取的任何其他 NoWarn 设置,例如从 directory.build.prop 文件中获取的设置。而是这样做:

    <PropertyGroup>
      <NoWarn>$(NoWarn);NU1701</NoWarn>
    </PropertyGroup>
    

    这样,所有全局设置都会被保留。

    【讨论】:

    • 不过,在&lt;PackageReference&gt; 内应该没问题,不是吗?
    • 这真的取决于。我的解决方案相当大,它广泛使用 Directory.Build.Props 文件来设置所有项目的通用设置。其中一项设置是要抑制的警告列表。在这种情况下,没有 $(NoWarn) 这个项目会覆盖该列表,并且只有一个 NU1707 抑制。
    【解决方案4】:

    正如 Yair 指出的,在 GitHub 上有一个围绕这个主题的未解决问题:github.com/NuGet/Home/issues/5740。

    如果使用回退框架版本解决的依赖项是可传递的,则禁止对引用的包发出警告。

    例如,Microsoft.TeamFoundationServer.ExtendedClient 依赖于与 .NET Core 3.0 不兼容的 Microsoft.AspNet.WebApi.Core,从而导致警告。将 NoWarn 添加到 Microsoft.TeamFoundationServer.ExtendedClient 将不起作用。

    作为一种解决方法(您可以在此处查看我的帖子:Workaround On GitHub Issue),您可以直接引用传递依赖并对该包使用 NoWarn。

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.3" NoWarn="NU1701" />
        <PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="16.153.0"/>
    </ItemGroup>
    

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      相关资源
      最近更新 更多