Incluindo arquivos de conteúdo em .csproj que estão fora do cone projeto

StackOverflow https://stackoverflow.com/questions/1292351

  •  18-09-2019
  •  | 
  •  

Pergunta

Eu tenho um C # digamos projeto MyProject.csproj localizado em "C: \ Projects \ MyProject \". Eu também tenho arquivos que deseja copiar para o diretório do projeto saída. Mas, os arquivos estão no local "C: \ MyContentFiles \", ou seja, eles não estão dentro do cone projeto. Este diretório tem sub-diretórios também. O conteúdo do diretório não é gerenciado. Por isso eu tenho que incluir todos o que está sob ele.

Quando eu incluí-los como 'Conteúdo' no projeto, eles são copiados, mas a estrutura do diretório está perdido. Eu fiz algo assim: -

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

Como faço para copiar esses arquivos / diretórios de forma recursiva no diretório de saída do projeto com a estrutura de diretórios preservada?

Foi útil?

Solução

Você precisa adicionar o arquivo como um link:

  1. Botão direito do mouse sobre o projeto no VS.
  2. Add -> Existing Item ...
  3. Localize o arquivo.
  4. Selecione-o e.
  5. Adicionar como um link (suspensa no botão Adicionar na caixa de diálogo).
  6. Abra as propriedades do arquivo e conjunto "Copy to Output Directory" para "Copiar sempre".

Mas você não pode fazê-lo para a árvore de diretórios.
Em vez disso, você precisa escrever tarefa de pós-build para isso. Esta é uma amostra que vai te olhava.

Outras dicas

Eu acredito @Dmytrii acerta por um lado -. Você quiser usar o recurso de "link"

No entanto, ele é apenas parcialmente correto quando diz que você não pode conectar-se a uma árvore de diretórios. Enquanto este é, de facto, verdade quando se tenta adicionar os links usando o Visual Studio GUI, MSBuild suporta isso.

Se você quiser preservar a estrutura de diretórios, basta adicionar a tag %(RecursiveDir) para seu nó <link>:

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

A página MSBuild Bem conhecido item de metadados entra em mais detalhes sobre o metadados você pode acessar.

A resposta de Mandark adiciona os arquivos de conteúdo diretamente para a solução, e eles vão aparecer no explorador solução. Sempre que um arquivo é adicionado ou excluído no diretório original, isso não é captado pelo visual studio automaticamente. Além disso, sempre que um arquivo é excluído ou adicionado no Explorer solução, o arquivo do projeto é alterado, e todos os arquivos são incluídas separadamente, em vez de apenas incluindo a pasta.

Para evitar isso, você pode usar o mesmo truque, mas colocá-lo em um arquivo de projeto separado e, em seguida, importá-lo.

O arquivo de projeto (por exemplo include.proj) se parece com isso:

<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" />

Visual Studio não vai mexer com esse arquivo, e apenas adiciona arquivos como conteúdo durante uma compilação. Mudanças no diretório original são sempre incluído. Os arquivos não vai aparecer na sua solução explorer, mas será incluído no diretório de saída.

Pegou neste truque aqui: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

A seguir, o que você gostaria de acrescentar a parte inferior do seu arquivo de projeto, irá copiar seus arquivos de conteúdo mantendo a estrutura de diretório em um após o evento de compilação ao $(TargetDirectory) diretório de destino da sua construção (tipicamente $(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 necessários para ir em um diretório chamado MyContentFiles, você pode adicionar isso antes da cópia:

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

e mudança

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

Para

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

Eu acho

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

é apenas o suficiente, já que você quer tudo em que pasta e subpastas

Para incluir arquivos em uma pasta para um projeto .NET Core,

<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

E a propriedade dos itens "Copy to Output Directory" será "Copy if newer":
Copy if newer

Para ignorar um arquivo em um projeto .Net Núcleo:

<ItemGroup>
 <Content Include="appsettings.local.json">
   <CopyToOutputDirectory Condition="Exists('appsettings.local.json')">PreserveNewest</CopyToOutputDirectory>
 </Content>
</ItemGroup>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top