Eu tenho um projeto C # que diz MyProject.csproj localizado em "C: \ Projects \ MyProject \". Também tenho arquivos que desejo copiados para o diretório de saída deste projeto. Porém, os arquivos estão na localização "C: \ MyContentFiles \", ou seja, NÃO estão dentro do cone do projeto. Este diretório também possui subdiretórios. O conteúdo do diretório não é gerenciado. Portanto, tenho que incluir tudo o que está sob ele.
Quando eu os incluo como 'Conteúdo' no projeto, eles são copiados, mas a estrutura do diretório é perdida. Eu fiz algo assim: -
<Content Include="..\..\MyContentFiles\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Como copio esses arquivos / diretórios recursivamente no diretório de saída do projeto com a estrutura de diretório preservada?
Eu acredito que @Dmytrii acertou por um lado - você quer usar o recurso "link".
No entanto, ele está apenas parcialmente correto ao dizer que você não pode vincular a uma árvore de diretório. Embora isso seja, de fato, verdadeiro ao tentar adicionar os links usando a GUI do Visual Studio, o MSBuild oferece suporte para isso.
Se você deseja preservar a estrutura do diretório, basta adicionar a
%(RecursiveDir)
tag ao seu<link>
nó:<Content Include="..\..\MyContentFiles\**\*.*"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
A página Metadados de item conhecidos do MSBuild apresenta mais detalhes sobre os metadados que você pode acessar.
fonte
<Content Include="..\..\MyContentFiles\**\*.*">
- observe o\*.*
no final do caminho.A resposta do Mandark adiciona os arquivos de conteúdo diretamente à solução e eles aparecerão no gerenciador de soluções. Sempre que um arquivo é adicionado ou excluído do diretório original, ele não é selecionado pelo Visual Studio automaticamente. Além disso, sempre que um arquivo é excluído ou adicionado ao explorador de soluções, o arquivo do projeto é alterado e todos os arquivos são incluídos separadamente, em vez de apenas incluir a pasta.
Para evitar isso, você pode usar o mesmo truque, mas colocá-lo em um arquivo de projeto separado e importá-lo.
O arquivo do projeto (por exemplo, include.proj) tem a seguinte aparência:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Content Include="..\..\MyContentFiles\**"> <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
Em seu próprio arquivo de projeto, adicione a seguinte linha
<Import Project="include.proj" />
O Visual Studio não vai mexer com esse arquivo e apenas adiciona arquivos como conteúdo durante uma compilação. As alterações no diretório original são sempre incluídas. Os arquivos não aparecerão em seu explorador de soluções, mas serão incluídos no diretório de saída.
Aprendeu esse truque aqui: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx
fonte
O seguinte, que você adicionaria ao final de seu arquivo de projeto, copiará seus arquivos de conteúdo mantendo a estrutura de diretório em um evento após a compilação para o diretório
$(TargetDirectory)
de destino de sua compilação (normalmente$(MSBuildProjectDirectory)\bin\Debug
).<ItemGroup> <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" /> </ItemGroup> <Target Name="AfterBuild"> <Copy SourceFiles="@(ExtraContent)" DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" /> </Target>
Se esses arquivos precisassem ir para um diretório chamado MyContentFiles, você poderia adicionar isso antes da cópia:
<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />
e mudar
<Copy SourceFiles="@(ExtraContent)" DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
Para
<Copy SourceFiles="@(ExtraContent)" DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
fonte
eu acho que
<Content Include="..\..\MyContentFiles\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
É apenas o suficiente, já que você quer tudo nessa pasta e subpastas
fonte
Para incluir arquivos em uma pasta para um projeto .NET Core,
<!--Just files--> <ItemGroup> <None Update="..\..\MyContentFiles\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> <!--Content files--> <ItemGroup> <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
E a propriedade dos itens "Copiar para diretório de saída" será "Copiar se mais recente":
fonte
Para ignorar um arquivo em um projeto .Net Core:
<ItemGroup> <Content Include="appsettings.local.json"> <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
fonte