wake-up-neo.com

.NET Core RuntimeIdentifier gegen TargetFramework

Kann jemand den Zweck dieser beiden in csproj-Datei (VS2017) erklären:

<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>

Ich bin gerade von VS2015 migriert und kann meine Web-API jetzt nicht veröffentlichen, da ich anscheinend nur ein Zielframework verwenden sollte. Außerdem kann ich nicht mehrere RIDs angeben. All diese veränderten Dinge machen mich frustriert. Nichts funktioniert von Grund auf, sollte etwas immer und immer wieder überwinden.

Ich möchte nur meine Web-API unter Windows entwickeln, hier xUnit-Tests ausführen und dann Web-API bereitstellen, um sie auf einem Linux-Server (Ubuntu) auszuführen. Was soll ich in csproj in beide Parameter setzen? Links mit guten Erklärungen werden sehr geschätzt.

pdate1

Ich habe eine Web-API mit referenzierten .net-Kernbibliotheken. Alles wurde von VS2015 migriert. Jetzt habe ich im Root-Projekt <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>. Wenn ich über VS2017 veröffentliche, erhalte ich folgende Fehlermeldung:

C:\Programme\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets (31,5): Fehler: Das Ziel 'Veröffentlichen' wird ohne Angabe von a nicht unterstützt Zielgerüst. Das aktuelle Projekt zielt auf mehrere Frameworks ab. Bitte geben Sie das Framework für die veröffentlichte Anwendung an.

Aber ich habe das Zielframework beim Veröffentlichen als netcoreapp1.1 Angegeben. OKAY. Dann habe ich mein csproj mit <PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup> aktualisiert, wie unten vorgeschlagen. Aber jetzt kann ich sogar keine App erstellen, bekomme Fehler:

5> C:\Programme (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets (92,5): Fehler: Assets-Datei '\ obj\project.assets.json 'hat kein Ziel für' .NETCoreApp, Version = v1.1/ubuntu.16.10-x64 '. Stellen Sie sicher, dass Sie dieses Projekt für TargetFramework = 'netcoreapp1.1' und RuntimeIdentifier = 'ubuntu.16.10-x64' wiederhergestellt haben.

Ich möchte nur mit VS2017 unter Windows 8.1/Windows7 entwickeln und auf Ubuntu 16.10 bereitstellen. Was mache ich falsch?

pdate2

Ich habe 8 Projekte in Lösung. 3 davon sind xUnit-Tests. Somit haben wir 5 Projekte. 4 davon sind Klassenbibliotheken und 1 ist meine Web-App. Alle 4 Klassenbibliotheken haben dies:

<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>    
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
</ItemGroup>

Meine Web App:

<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

Wie veröffentliche ich meine Web-App?

16
Alezis

<TargetFramework> (Oder <TargetFrameworks>, Wenn Sie mehrere Ziele haben möchten, z. B. net451, Ein oder mehrere netstandard1.x Usw.). Pro <TargetFramework>/<TargetFrameworks> - Eintrag wird ein Satz von Baugruppen erstellt und in bin\Debug\<targetframeworkid>) Platziert.

Dies ist nützlich, wenn Sie eine andere Bibliothek in .NET Core verwenden möchten (da die von Ihnen verwendete Bibliothek nur mit vollständigem .NET Framework wie z. B. 4.5.1 funktioniert) oder diese Funktion aus .NET Core entfernen möchten, da sie nicht unterstützt wird.

Es wird sowohl zum Erstellen als auch zum Wiederherstellen von NuGet verwendet. Das heißt, Sie können in einem .NET Core-Projekt (z. B. net451) keine Bibliothek nur mit netstandard 1.1 verwenden. Sie können jedoch netstandard1.1 in einem Projekt mit net451 verwenden )

<RuntimeIdentifier>/<RuntimeIdentifiers> Auf der anderen Seite wird hauptsächlich für NuGet verwendet. Es teilt NuGet mit, welche Pakete Sie benötigen. Wenn Sie beispielsweise Linux, Mac und Windows als Ziel haben möchten, erfordern bestimmte Assemblys native Bibliotheken (z. B. Verschlüsselung. Unter Windows wird CryptoAPI verwendet, unter Linux und Mac benötigen Sie OpenSSL). Dies schließt nicht verwaltete DLLs und * .so (Linux) -Dateien ein.

d. h. <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers> erstellt Nuget-Wiederherstellungspakete für Win7-Versionen (x64 und x86) und x64 nur für Ubuntu. Dies ist erforderlich, da Sie bei der Arbeit mit Windows auch diese nativen Bibliotheken herunterladen müssen, damit Sie sie mit dotnet publish Bereitstellen/verpacken können.

Hier ein kleiner Haken: Wenn Sie eine vollständige .NET Framework-Referenz in <TargetFramework> Oder <TargetFrameworks> Haben, müssen Sie ein einzelnes <RuntimeIdentifier> Angeben (Singular, nicht Plural <RuntimeIdentifiers>), Sonst erhalten Sie eine Fehlermeldung.

Beispielsweise:

<PropertyGroup>
    <TargetFrameworks>netstandard1.0;net451</TargetFrameworks>
    <RuntimeIdentifiers>win7-x64;win-7x86;ubuntu.16.10-x64</RuntimeIdentifiers>    
</PropertyGroup>

<!-- This entry will only be used for the .NET Framework 4.5.1 output -->
<PropertyGroup Condition="'$(TargetFramework)' == 'net451'">
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
</PropertyGroup>
17
Tseng

RID ist die Abkürzung für Runtime IDentifier. RIDs werden verwendet, um Zielbetriebssysteme zu identifizieren, auf denen eine Anwendung oder ein Asset (d. H. Assembly) ausgeführt wird. Sie sehen so aus: "ubuntu.14.04-x64", "win7-x64", "osx.10.11-x64". Bei Paketen mit nativen Abhängigkeiten wird angegeben, auf welchen Plattformen das Paket wiederhergestellt werden kann.

Mehr in docs

Wechseln Sie zunächst von win7 Zu win7-x64 Oder win7-x86. Als nächstes füge eine andere RID wie Ubuntu hinzu. Beispielsweise:

<PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
    <RuntimeIdentifier>win7-x64;ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>

Zielgerüst sieht gut aus. Lesen Sie weiter docs

2
J. Doe