Hay varias formas de lograr sus objetivos, según cuáles sean sus necesidades.
El enfoque más fácil es configurar los elementos de metadatos ( CopyToOutputDirectory
/ CopyToPublishDirectory
) de forma condicional (asumiendo que .txt
es un None
elemento en lugar de Content
, si no funciona, intente en su <Content>
lugar):
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
<None Update="foo.txt" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Si se requiere más control, el enfoque más versátil es agregar destinos personalizados que se enganchan en el proceso de compilación en el archivo 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>
Esto copia un archivo a los directorios respectivos. Para obtener más opciones para la <Copy>
tarea, consulte su documentación . Para limitar esto a ciertas configuraciones, puede utilizar un Condition
atributo:
<Target … Condition=" '$(Configuration)' == 'Release' ">
Este Condition
atributo se puede aplicar tanto en el <Target>
elemento como en elementos de tarea como <Copy>
.
DestinationSubDirectory="subdir\"
metadatos enReference
elementos directamente. Sin embargo, esto significa que debe implementar la resolución de ensamblaje usted mismo ( evento AssemblyResolve )Si bien esto me ayudó a solucionar mi problema, no funcionó para todos los archivos en un subdirectorio. También usé en
Content Include
lugar deContent 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>
fuente
<Content Include="layouts\**\*.*">
<Project Sdk="Microsoft.NET.Sdk.Web">
), no le permitirá usarloInclude=
porque ya parece especificarlo implícitamente dentro del SDK. Tuve que usarloUpdate=
para construir e incluir mis archivos adicionales.assets\*.*
debe asumirlo. Pero copia la carpeta de activos completa. Así que tengobin/Debug/netcoreapp3.1/assets/...
Pero quiero los archivos de la carpeta de activos en el directorio raíz de la salida.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>
(vea mi respuesta para un mejor formato de código).Coloque esto en su archivo .csproj reemplazando nlog.config con la ruta de archivo deseada. Luego, simplemente guárdelo y construya su proyecto:
<ItemGroup> <Content Update="Nlog.config"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
fuente
Suponiendo que tiene una
assets
carpeta en su directorio raíz. Puedes nombrarlo como quieras. Este es solo un ejemplo:tu-proyecto.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>
esto copia solo el contenido de la
assets
carpeta en la raíz de salida sin envolverlo en laassets
carpeta. Pero si desea copiar con la carpeta en sí, puede usar el siguiente código:<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <Content Include="assets\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
fuente
Tenía el requisito de que una selección de plantillas HTML fueran consumibles tanto del lado del cliente como del lado del servidor (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>
fuente
Gracias por salvarme el día, si necesita forzar la copia de un paquete nuget específico en un proyecto principal de asp.net (2.2), agregue al final de su 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>
fuente
<PropertyGroup> <PostBuildEvent>xcopy "$(ProjectDir)Xml" "$(ProjectDir)$(OutDir)Xml" /S /F /I /R /Y</PostBuildEvent> </PropertyGroup>
o
<PropertyGroup> <PostBuildEvent>copy /Y "$(ProjectDir)MyXml.xml" "$(ProjectDir)$(OutDir)Xml"</PostBuildEvent> </PropertyGroup>
fuente