Es gibt einige Möglichkeiten, um Ihre Ziele zu erreichen, je nachdem, welche Bedürfnisse Sie haben.
Der einfachste Ansatz besteht darin, die Metadaten ( CopyToOutputDirectory
/ CopyToPublishDirectory
) -Elemente bedingt festzulegen (vorausgesetzt, .txt
es handelt sich um ein None
Element, anstatt Content
es zu versuchen, wenn es nicht funktioniert <Content>
):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Wenn mehr Kontrolle erforderlich ist, besteht der vielseitigste Ansatz darin, benutzerdefinierte Ziele hinzuzufügen, die in den Erstellungsprozess in der csproj-Datei eingebunden sind:
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
<Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>
Dadurch wird eine Datei in die jeweiligen Verzeichnisse kopiert. Weitere Optionen für die <Copy>
Aufgabe finden Sie in der Dokumentation . Um dies auf bestimmte Konfigurationen zu beschränken, können Sie ein Condition
Attribut verwenden:
<Target … Condition=" '$(Configuration)' == 'Release' ">
Dieses Condition
Attribut kann sowohl auf das <Target>
Element als auch auf Aufgabenelemente wie angewendet werden <Copy>
.
DestinationSubDirectory="subdir\"
Metadaten fürReference
Elemente direkt festlegen . Dies bedeutet jedoch, dass Sie die Assemblyauflösung selbst implementieren müssen ( AssemblyResolve-Ereignis )Dies half mir zwar, mein Problem zu lösen, funktionierte jedoch nicht für alle Dateien in einem Unterverzeichnis. Ich habe auch
Content Include
eher verwendet alsContent Update
;quelle
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
) verwenden, können Sie es nicht verwenden,Include=
da dies bereits implizit im SDK angegeben zu sein scheint. Ich musste es verwendenUpdate=
, um es zu erstellen und meine zusätzlichen Dateien einzuschließen.assets\*.*
sollte es annehmen. Es wird jedoch der gesamte Assets-Ordner kopiert. Ich habebin/Debug/netcoreapp3.1/assets/...
aber ich möchte die Dateien des Assets-Ordners in das Stammverzeichnis der Ausgabe.bin/Debug/netcoreapp3.1/...
.xml <Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AssetsSourceFiles Include="assets/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContent" AfterTargets="AfterBuild"> <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /> </Target> </Project>
(Ein besseres Codeformat finden Sie in meiner Antwort.)Fügen Sie dies in Ihre .csproj-Datei ein und ersetzen Sie nlog.config durch den gewünschten Dateipfad. Dann speichern Sie es einfach und erstellen Sie Ihr Projekt:
quelle
Angenommen, Sie haben einen
assets
Ordner in Ihrem Stammverzeichnis. Sie können es benennen, wie Sie möchten. Dies ist nur ein Beispiel:your-project.csproj
Dadurch wird nur der Inhalt des
assets
Ordners in das Ausgabestammverzeichnis kopiert, ohne ihn in denassets
Ordner einzuschließen. Wenn Sie jedoch mit dem Ordner selbst kopieren möchten, können Sie den folgenden Code verwenden:quelle
Ich hatte die Anforderung, dass eine Auswahl von HTML-Vorlagen sowohl clientseitig als auch serverseitig verwendet werden kann (Lenker js).
quelle
Vielen Dank, dass Sie meinen Tag retten. Wenn Sie das Kopieren eines bestimmten Nuget-Pakets in ein asp.net-Kernprojekt (2.2) erzwingen müssen, fügen Sie am Ende Ihres csproj Folgendes hinzu:
quelle
oder
quelle