Istnieje kilka sposobów osiągnięcia swoich celów, w zależności od Twoich potrzeb.
Najprostszym podejściem jest warunkowe ustawienie elementów metadanych ( CopyToOutputDirectory
/ CopyToPublishDirectory
) (zakładając .txt
, że jest to None
element, a Content
jeśli nie działa, spróbuj <Content>
zamiast tego):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Jeśli wymagana jest większa kontrola, najbardziej wszechstronnym podejściem jest dodanie niestandardowych celów, które przechodzą do procesu kompilacji w pliku csproj:
<Target Name="CopyCustomContent" AfterTargets="AfterBuild">
<Copy SourceFiles="foo.txt" DestinationFolder="$(OutDir)" />
</Target>
<Target Name="CopyCustomContentOnPublish" AfterTargets="Publish">
<Copy SourceFiles="foo.txt" DestinationFolder="$(PublishDir)" />
</Target>
Spowoduje to skopiowanie pliku do odpowiednich katalogów. Więcej opcji dotyczących <Copy>
zadania można znaleźć w jego dokumentacji . Aby ograniczyć to do określonych konfiguracji, możesz użyć Condition
atrybutu:
<Target … Condition=" '$(Configuration)' == 'Release' ">
Ten Condition
atrybut można zastosować zarówno do <Target>
elementu, jak i do elementów zadania, takich jak <Copy>
.
DestinationSubDirectory="subdir\"
metadaneReference
elementów bezpośrednio. Oznacza to jednak, że musisz samodzielnie wdrożyć rozwiązanie zespołu ( wydarzenie AssemblyResolve )Chociaż pomogło mi to w rozwiązaniu problemu, nie działało w przypadku wszystkich plików w podkatalogu. Użyłem też
Content Include
zamiastContent Update
.<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> </PropertyGroup> <ItemGroup> <Content Include="layouts\*.*"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
źródło
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
) nie pozwala na użycie,Include=
ponieważ wydaje się, że już niejawnie określa to w zestawie SDK. Musiałem go użyćUpdate=
, aby skompilować i dołączyć moje dodatkowe pliki.assets\*.*
powinno to przyjąć. Ale kopiuje cały folder zasobów. Więc mam,bin/Debug/netcoreapp3.1/assets/...
ale chcę, aby pliki folderu zasobów do katalogu głównego danych wyjściowych.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>
(zobacz moją odpowiedź dla lepszego formatu kodu.)Zakładając, że masz
assets
folder w katalogu głównym. Możesz nazwać to, jak chcesz. To tylko przykład:twój-projekt.csproj
<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AssetsSourceFiles Include="assets/**/*.*"/> </ItemGroup> <Target Name="CopyCustomContent" AfterTargets="AfterBuild"> <Copy SourceFiles="@(AssetsSourceFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" /> </Target> </Project>
kopiuje to tylko zawartość
assets
folderu do wyjściowego katalogu głównego bez zawijania go doassets
folderu. Ale jeśli chcesz skopiować z samym folderem, możesz użyć następującego kodu:<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <Content Include="assets\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
źródło
Umieść to w swoim pliku .csproj, zastępując nlog.config żądaną ścieżką do pliku. Następnie po prostu zapisz go i zbuduj swój projekt:
<ItemGroup> <Content Update="Nlog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
źródło
Wymagałem, aby wybór szablonów HTML był możliwy do wykorzystania zarówno po stronie klienta, jak i po stronie serwera (Handlebars js)
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <Content Update="wwwroot\html-templates\**\*.*"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
źródło
<PropertyGroup> <PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent> </PropertyGroup>
lub
<PropertyGroup> <PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent> </PropertyGroup>
źródło
Jeśli musisz wymusić skopiowanie określonego pakietu NuGet do projektu ASP.NET Core (2.2), dodaj na końcu swojego csproj:
<!-- Force copy MathNet because we need it in compilation --> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" /> </Target> <ItemGroup> <ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <TargetPath>MathNet.Numerics.dll</TargetPath> </ContentWithTargetPath> </ItemGroup>
źródło