Dotnet-Wiederherstellungswarnung NU1701

69

Ich verwende .NET Core mit C # und als ich dies tat dotnet restore, gab es den folgenden Fehler:

PS C: \ workspace \ Arbitrator> Dotnet-Wiederherstellung

C: \ workspace \ Arbitrator \ Arbitrator.csproj: Warnung NU1701: Das Paket 'PusherClient 0.5.0' wurde mithilfe von '.NETFramework, Version = v4.6.1' anstelle des Projektzielframeworks '.NETCoreApp, Version = v2.0' wiederhergestellt. Dies kann zu Kompatibilitätsproblemen führen. C: \ workspace \ Arbitrator \ Arbitrator.csproj: Warnung NU1701: Das Paket 'WebSocket4Net 0.14.1' wurde mit '.NETFramework, Version = v4.6.1' anstelle des Projektzielframeworks '.NETCoreApp, Version = v2.0' wiederhergestellt. Dies kann zu Kompatibilitätsproblemen führen.

Dieses problematische Paket ist PusherClient . Ich habe gerade die NuGet-Dokumente befolgt, um sie zu importieren. Wie kann ich diese Warnung beheben?

fluter
quelle

Antworten:

91

Sie müssen nicht unbedingt warten, bis PusherClient für .NET Core aktualisiert wurde.

Das Verweisen auf .NET Framework 4.6.1 (und niedriger) aus .NET Core ist eine neue Funktion, die seit .NET Core / Standard 2.0 Preview 2 / VS 2017 Preview 15.3 verfügbar ist. Laut MS kann sie als hilfreiche Funktion angesehen werden Sie migrieren .NET Framework-Code im Laufe der Zeit zu .NET Standard oder .NET Core .

  1. Sie können diese Warnung einfach unterdrücken

    • für ein bestimmtes Paket
     <PackageReference Include="Contoso.Base.API" Version="1.0.3">
         <NoWarn>NU1701</NoWarn>
     </PackageReference>
    
    • für alle Pakete
     <NoWarn>NU1701</NoWarn>
    

    In den Szenarien 2 und 3 im NuGet-Wiki finden Sie Möglichkeiten, dies über die GUI zu tun .

    Es ist jedoch möglich, dass Ihre Anwendung zur Laufzeit fehlschlägt, wenn Sie eine API (wie z. B. etwas von WPF) aufrufen, die von .NET Core nicht unterstützt wird. Ein weiterer Grund für einen Fehler könnten native APIs sein, die möglicherweise von PusherClient verwendet werden . Sie sollten es also ausgiebig testen. In den meisten Fällen funktioniert es jedoch nur auf allen Plattformen, auf denen .NET Core unterstützt wird (z. B. habe ich eine Anwendung mit der Abhängigkeit von MathNet.Numerics getestet und es funktioniert unter Linux, obwohl MathNet.Numerics auch .NET Framework 4.6.1 ist ).

  2. Wenn Ihre App nicht plattformübergreifend sein muss, ändern Sie einfach das Zielframework in .NET 4.6.1, indem Sie Ihrer csproj-Datei Folgendes hinzufügen:

     <TargetFramework>net461</TargetFramework>
    
Sourcerer
quelle
1
Ist es möglich, eine solche Warnung zu unterdrücken?
mateuszlewko
9
Ja, setzen Sie <PropertyGroup> <NoWarn> NOU1701 </ NoWarn> </ PropertyGroup> in Ihre csproj
Lars Truijens
Es kann keine Möglichkeit gefunden werden, die Warnung per PackageReferencein der .csprojDatei zu unterdrücken . Ich habe zu diesem Thema ein offenes Thema gefunden: github.com/NuGet/Home/issues/5740 .
Geben Sie
27

Als Randnotiz tun Sie dies nicht:

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

Dadurch werden alle anderen NoWarn-Einstellungen beschädigt, die an anderer Stelle abgerufen werden, z. B. aus einer Datei directory.build.prop. Tun Sie stattdessen Folgendes:

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

Auf diese Weise bleiben alle globalen Einstellungen erhalten.

Chris M.
quelle
Das sollte in Ordnung sein, um in einem zu sein <PackageReference>, nicht wahr?
Ray
Das kommt wirklich darauf an. Meine ziemlich große Lösung verwendet die Datei Directory.Build.Props in großem Umfang, um gemeinsame Einstellungen für alle Projekte festzulegen. Eine dieser Einstellungen ist eine Liste der zu unterdrückenden Warnungen. In diesem Fall ohne $ (NoWarn) überschreibt dieses Projekt diese Liste und hat nur die einzige NU1707-Unterdrückung.
Chris M.
8

Für .NET Core 1.x:

Sie müssen den Jungs von PusherClient sagen, dass sie ihr Projekt .NET-Core fertig machen sollen.

DR
quelle
Was macht die Bibliothek nicht .NET-Core bereit? Es ist bereits in nuget.org, also denke ich, dass es in Ordnung ist, es zu verwenden?
Fluter
1
@fluter PusherClient ist eine .Net Framework-Bibliothek. Um es auf .Net Core 1.x zu verwenden, müsste es in eine .Net Standard 1.x-Bibliothek geändert werden.
Svick
1
@fluter Laut MS handelt es sich jedoch um eine neue Funktion der 2.0-Version von .NET Core, auf die Sie in .NET Framework 4.6.1-Bibliotheken (und darunter) verweisen können.
Sourcerer
2

Wie Yair betonte, gibt es auf GitHub ein offenes Problem zu diesem Thema: github.com/NuGet/Home/issues/5740 .

Wenn die mit einer Fallback-Framework-Version aufgelöste Abhängigkeit transitiv ist, funktioniert das Unterdrücken der Warnung für das Paket, auf das verwiesen wird, nicht.

Beispielsweise ist Microsoft.TeamFoundationServer.ExtendedClient von Microsoft.AspNet.WebApi.Core abhängig, das nicht mit .NET Core 3.0 kompatibel ist, was zu einer Warnung führt. Das Hinzufügen von NoWarn zu Microsoft.TeamFoundationServer.ExtendedClient funktioniert nicht.

Als Problemumgehung (Sie können meinen Beitrag hier sehen: Problemumgehung bei GitHub ) können Sie direkt auf die transitive Abhängigkeit verweisen und NoWarn für dieses Paket verwenden.

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