Есть несколько способов достичь ваших целей, в зависимости от ваших потребностей.
Самый простой подход - условно установить элементы метаданных ( CopyToOutputDirectory
/ CopyToPublishDirectory
) (предполагается, .txt
что это None
элемент, а не Content
, если он не работает, попробуйте <Content>
вместо этого):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Если требуется больше контроля, наиболее универсальным подходом является добавление настраиваемых целей, которые подключаются к процессу сборки в файле 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>
Это копирует файл в соответствующие каталоги. Дополнительные параметры <Copy>
задачи см. В ее документации . Чтобы ограничить это определенными конфигурациями, вы можете использовать Condition
атрибут:
<Target … Condition=" '$(Configuration)' == 'Release' ">
Этот Condition
атрибут может применяться как к <Target>
элементу, так и к элементам задачи, например <Copy>
.
DestinationSubDirectory="subdir\"
метаданные дляReference
элементов. Однако это означает, что вам нужно реализовать разрешение сборки самостоятельно ( событие AssemblyResolve )Хотя это помогло мне решить мою проблему, это не сработало для всех файлов в подкаталоге. Я также использовал
Content Include
вместоContent 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>
источник
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
) он не позволит вам использовать,Include=
потому что он уже, кажется, неявно указывает это в SDK. Мне пришлось использоватьUpdate=
его для сборки и включения дополнительных файлов.assets\*.*
должно предполагать это. Но он копирует всю папку с активами. Итак, у меня естьbin/Debug/netcoreapp3.1/assets/...
Но я хочу, чтобы файлы папки с активами находились в корневом каталоге вывода.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>
(см. Мой ответ, чтобы узнать о лучшем формате кода.)Поместите это в свой .csproj файл, заменив nlog.config на желаемый путь к файлу. Затем просто сохраните его и создайте свой проект:
<ItemGroup> <Content Update="Nlog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
источник
Предполагая, что у вас есть
assets
папка в корневом каталоге. Вы можете называть его как хотите. Это всего лишь пример:ваш-проект.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>
это копирует только содержимое
assets
папки в выходной корень, не помещая его вassets
папку. Но если вы хотите скопировать вместе с самой папкой, вы можете использовать следующий код:<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <Content Include="assets\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
источник
У меня было требование, чтобы набор шаблонов HTML был потребляемым как на стороне клиента, так и на стороне сервера (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>
источник
Спасибо, что спасли меня, если вам нужно принудительно скопировать определенный пакет nuget в основной проект asp.net (2.2), добавьте в конец вашего 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>
источник
<PropertyGroup> <PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent> </PropertyGroup>
или
<PropertyGroup> <PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent> </PropertyGroup>
источник