Ich versuche, ein Plugin-System mit .NET Core zu schreiben. Eine meiner Anforderungen besteht darin, die Plugin-DLL zusammen mit ihren Abhängigkeiten zur Installation an den Benutzer zu verteilen.
Ich kann jedoch nicht herausfinden, wie ich meine NuGet-Abhängigkeiten als Build-Artefakt einbinden und in den Build-Ordner ausgeben kann, ohne sie dotnet publish
als Hack verwenden zu müssen. Gibt es eine Möglichkeit, dies in der .csproj-Datei (Projektdatei) anzugeben?
dotnet publish
ein Hack sein? Fügen Sie den Befehl als Post-Build-Skript in Ihre csproj-Datei ein.dotnet publish
wirft das gesamte Framework in den Publish-Ordner, da ich ein Plugin schreibe, sind die meisten Dateien nicht erforderlich, da das Framework bereits vom Bootstrapper-Programm geladen würde. Ich suche nach etwas Ähnlichem wie Builds unter .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
das Einfügen in Ihr csproj in jede der DLLs, die Sie verschieben möchten, reicht nicht aus? Vielleicht mit einem<link>
Knoten kombiniert ?<PackageReference/>
unterstützt nicht<CopyToOutputDirectory>
.Antworten:
Sie können dies zu einer
<PropertyGroup>
Datei in Ihrer csproj-Datei hinzufügen, um das Kopieren von NuGet-Assemblys in die Build-Ausgabe zu erzwingen:Beachten Sie jedoch, dass die Build-Ausgabe (
bin/Release/netcoreapp*/*
) nicht portabel und verteilbar sein soll, sondern die Ausgabe vondotnet publish
. In Ihrem Fall ist das Kopieren der Assemblys in die Build-Ausgabe wahrscheinlich zu Testzwecken sehr nützlich. Beachten Sie jedoch, dass Sie dieDependencyContext
API auch verwenden können , um die DLLs und ihre Speicherorte aufzulösen, die Teil des Abhängigkeitsdiagramms der Anwendung sind, anstatt ein lokales Verzeichnis aufzulisten.quelle
DependencyContext
? Wie kann ich damit eine DLL finden, die sich nicht im Anwendungsverzeichnis befindet? Wo ist es überhaupt?Mit PostBuildEvent können Sie die Modulbereitstellung beim Erstellen automatisieren.
Um NuGet-Assemblys in den Build-Ordner zu bringen, fügen Sie csproj Ihres Moduls hinzu
Definieren Sie mithilfe von Einschließen / Ausschließen, welche Moduldateien wo angezeigt werden sollen (ändern Sie den Pfad nach Bedarf).
Setzen Sie Ihren Build-Ordner auf den Standard zurück und fügen Sie PostbuildEvent hinzu
Ich füge app_offline hinzu, um die App zu recyceln, wenn sie bereits ausgeführt wird, um Fehler bei der Verwendung von Dateien zu vermeiden.
quelle
Hinzufügen
hat nicht funktioniert, aber dies zur Framework .csproj-Datei hinzugefügt:
tat.
quelle
Ich habe dies auf einfachere Weise "gelöst" (umgangen).
In Post Build
pub
ist der Ordner, in dem Ihre veröffentlichten Inhalte bereitgestellt werden sollenHINWEIS: Je nachdem, welche Version
dotnet.exe
Sie verwenden, ist der Befehl--no-build
möglicherweise nicht verfügbar.Zum Beispiel nicht verfügbar in v2.0.3; und verfügbar in v2.1.402. Ich weiß, dass VS2017 Update4 v2.0.3 hatte. Und Update8 hat 2.1.x.
Aktualisieren:
Das obige Setup funktioniert in der Basis-Debug-Umgebung, aber um es in die Build-Server- / Produktionsumgebung zu integrieren, ist mehr erforderlich. In diesem speziellen Beispiel, das ich lösen musste, bauen wir
Release|x64
undRelease|x86
getrennt. Also habe ich beides erklärt. Um den Post-Build-dotnet publish
Befehl zu unterstützen, habe ich zuerst eineRuntimeIdentifier
Projektdatei hinzugefügt .Warum brauchte ich es und warum kannst du ohne es davonkommen? Ich brauchte dies, weil mein Build-Programm so eingestellt ist, dass es die Warnung MSB3270 abfängt und den Build fehlschlägt, wenn er angezeigt wird. Diese Warnung lautet: "Hey, einige Dateien in Ihren Abhängigkeiten haben ein falsches Format." Aber erinnern Sie sich an das Ziel dieser Übung? Wir müssen Paketabhängigkeits-DLLs ziehen. In vielen Fällen spielt es keine Rolle, ob diese Warnung vorhanden ist, da es nicht wichtig ist, dem Post-Build zu folgen. Auch dies ist mein Build-Programm, das sich interessiert. Daher habe ich nur
RuntimeIdentifier
2 Konfigurationen hinzugefügt , die ich während des Produktionsaufbaus verwende.Vollständiger Post-Build
Erläuterung: dotnet Publish sucht nach
obj\Debug
oderobj\Release
. Wir haben es nicht während des Builds, weil Build erstelltobj\x64\Release
oderobj\x86\Release
. Zeile 1 und 2 mindern dieses Problem. In Zeile 3 fordere ich Siedotnet.exe
auf, eine bestimmte Konfiguration und Ziellaufzeit zu verwenden. Andernfalls, wenn dies der Debug-Modus ist, interessieren mich Laufzeitsachen und Warnungen nicht. Und in der letzten Zeile nehme ich einfach meine DLLs und kopiere sie dann in den Ausgabeordner. Job erledigt.quelle
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
In Verbindung mit der obigen Antwort: In der Befehlszeile für Post-Build-Ereignisse funktioniert dies hervorragend : in Visual Studio. Es durchläuft eine Auswahl von DLLs (System * .dll und Microsoft .dll) * und überspringt dann das Löschen bestimmter DLLs. System.Data.SqlClient.dll und System.Runtime.Loader.dll
quelle