Ada beberapa cara untuk mencapai tujuan Anda, tergantung pada kebutuhan Anda.
Pendekatan termudah adalah menyetel item metadata ( CopyToOutputDirectory
/ CopyToPublishDirectory
) secara bersyarat (dengan asumsi .txt
sebagai None
item, bukan Content
, jika tidak berhasil, coba <Content>
saja):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Jika lebih banyak kontrol diperlukan, pendekatan yang paling serbaguna adalah menambahkan target kustom yang terhubung ke proses build di file 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>
Ini menyalin file ke direktori masing-masing. Untuk opsi lebih lanjut untuk <Copy>
tugas tersebut, lihat dokumentasinya . Untuk membatasinya ke konfigurasi tertentu, Anda dapat menggunakan Condition
atribut:
<Target … Condition=" '$(Configuration)' == 'Release' ">
Condition
Atribut ini dapat diterapkan baik pada <Target>
elemen atau elemen tugas seperti <Copy>
.
DestinationSubDirectory="subdir\"
metadata padaReference
item secara langsung. Namun ini berarti Anda perlu mengimplementasikan resolusi perakitan sendiri ( acara AssemblyResolve )Meskipun ini membantu saya menyelesaikan masalah saya, ini tidak berfungsi untuk semua file di sub-direktori. Saya juga menggunakan
Content Include
daripadaContent 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>
sumber
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
), Anda tidak dapat menggunakannyaInclude=
karena tampaknya secara implisit menentukannya dalam SDK. Saya harus menggunakannyaUpdate=
untuk membangun dan menyertakan file tambahan saya.assets\*.*
harus mengasumsikannya. Tapi itu menyalin folder aset lengkap. Jadi saya punyabin/Debug/netcoreapp3.1/assets/...
Tapi saya ingin file-file dari folder aset ke direktori root dari output.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>
(lihat jawaban saya untuk format kode yang lebih baik.)Dengan asumsi Anda memiliki
assets
folder di direktori root Anda. Anda dapat menamainya sesuai keinginan. Ini hanya sebuah contoh:proyek-Anda.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>
ini hanya menyalin konten
assets
folder ke root keluaran tanpa membungkusnya ke dalamassets
folder. Tetapi jika Anda ingin menyalin dengan folder itu sendiri, Anda dapat menggunakan kode berikut:<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <Content Include="assets\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
sumber
Tempatkan ini di file .csproj Anda, ganti nlog.config dengan jalur file yang diinginkan. Kemudian simpan dan buat proyek Anda:
<ItemGroup> <Content Update="Nlog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
sumber
Saya memiliki persyaratan untuk pilihan template HTML agar dapat digunakan di sisi klien dan sisi server (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>
sumber
<PropertyGroup> <PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent> </PropertyGroup>
atau
<PropertyGroup> <PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent> </PropertyGroup>
sumber
Jika Anda perlu memaksa salinan paket NuGet tertentu ke dalam proyek ASP.NET Core (2.2), tambahkan di akhir csproj Anda:
<!-- 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>
sumber