2009-08-18 10 views
57

Ho un progetto C# che dice che MyProject.csproj si trova in "C: \ Projects \ MyProject \". Ho anche dei file che voglio copiare nella directory di output di questo progetto. Ma i file si trovano nella posizione "C: \ MyContentFiles \", cioè NON sono all'interno del cono del progetto. Questa directory ha anche sottodirectory. Il contenuto della directory non è gestito. Quindi devo includere tutto ciò che è sotto di esso.Inclusione dei file di contenuto in .csproj che si trovano all'esterno del cono del progetto

Quando li includo come "Contenuto" nel progetto, vengono copiati, ma la struttura della directory viene persa. Ho fatto qualcosa di simile: -

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

Come faccio a copiare questi file/directory ricorsivamente nella directory di output del progetto con la struttura delle directory conservato?

risposta

33

è necessario aggiungere file come un collegamento:

  1. Fare clic destro sul progetto in VS.
  2. Aggiungi -> Elemento esistente ...
  3. Trova il file.
  4. Selezionarlo e.
  5. Aggiungi come collegamento (fai clic sul pulsante Aggiungi nella finestra di dialogo).
  6. Aprire le proprietà del file e impostare "Copia nella directory di output" su "Copia sempre".

MA Non è possibile farlo per l'albero delle directory.
Invece è necessario scrivere un'attività post-build per quello. This is a sample che ti farà fissare.

+5

Come indicato in [questa risposta] (http : //stackoverflow.com/a/11808911/1576096), "Non è possibile farlo per l'albero delle directory". affermazione non è vera. – Mandark

8

Quanto segue, che si aggiungerebbe alla fine del file di progetto, copierà i file di contenuto mantenendo la struttura di directory in un evento after-build nella directory di destinazione $(TargetDirectory) della build (in genere $(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 questi file necessari per andare in una directory denominata MyContentFiles, si potrebbe aggiungere questo prima che la copia:

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

e cambiare

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

Per

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

Le tue trasformazioni hanno un tipo -o: @ (ExtraContent) -> '...') dovrebbe essere @ (ExtraContext -> '...'). Altrimenti buona risposta! – alexdej

+0

@Todd 1) Cosa succede se un file viene cancellato dall'archivio MyContentFiles? Non sembra che verrà eliminato dalla soluzione Dir 2) C'è un modo per ottenere Visual Studio per eliminare questi file da $ (SolutionDir) al termine dell'esecuzione. Lasciandoli lì potrebbero confondere altri sviluppatori. – Adam

106

Credo @Dmytrii lo fa bene da un lato - si desidera utilizzare la funzione "link".

Tuttavia, ha solo parzialmente ragione quando dice che non è possibile collegarsi a un albero di directory. Mentre questo è, in effetti, vero quando si tenta di aggiungere i collegamenti utilizzando la GUI di Visual Studio, MSBuild supporta questo.

Se si desidera mantenere la struttura di directory, è sufficiente aggiungere il tag %(RecursiveDir) per il nodo <link>:

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

La pagina MSBuild Well-known Item Metadata va più in dettaglio sui metadati è possibile accedere.

+1

1) Cosa succede se un file viene cancellato dall'archivio Risorse condivise? Non sembra che verrà eliminato dalla soluzione Dir 2) C'è un modo per ottenere Visual Studio per eliminare questi file da $ (SolutionDir) al termine dell'esecuzione. Lasciandoli lì potrebbero confondere altri sviluppatori. – Adam

+0

@Adam Vedere la mia risposta sotto –

+4

Essendo caduto in una zona selvaggia con poco cibo, acqua e avendo il forte bisogno di compagnia, trovo questa risposta utile. Seguendo queste istruzioni, sono stato in grado di costruire un'IA completamente funzionale che ora ha sostituito tutti i bisogni umani che una volta mi perseguitavano nel deserto qui. Grazie Mandark! – deepelement

23

La risposta di Mandark aggiunge i file di contenuto direttamente alla soluzione e verranno visualizzati in Solution Explorer. Ogni volta che un file viene aggiunto o eliminato nella directory originale, questo non viene rilevato automaticamente da Visual Studio. Inoltre, ogni volta che un file viene eliminato o aggiunto in Solution Explorer, il file di progetto viene modificato e tutti i file vengono inclusi separatamente, invece di includere solo la cartella.

Per evitare questo, è possibile utilizzare lo stesso trucco, ma inserirlo in un file di progetto separato e quindi importarlo.

Il file di progetto (ad esempio include.proj) si presenta così:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<ItemGroup> 
<Content Include="..\..\MyContentFiles\**"> 
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 
</ItemGroup> 
</Project> 

Nel vostro file di progetto, aggiungere la seguente riga

<Import Project="include.proj" /> 

Visual Studio non rovinare con questo file e aggiunge semplicemente i file come contenuto durante una compilazione. Le modifiche nella directory originale sono sempre incluse. I file non verranno visualizzati nel tuo solution explorer, ma saranno inclusi nella directory di output.

raccolto su questo trucco qui: http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx

+1

Per qualche motivo, questo non sembra funzionare per me usando un file .proj, ma sono riuscito a farlo funzionare con un file .csproj. – StriplingWarrior

+5

È possibile aggiungere true all'elemento Contenuto per rendere gli elementi visualizzati in Esplora soluzioni. –

+0

Il mio era ok con solo un .proj –

3

Penso

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

è appena sufficiente, dal momento che si vuole tutto in quella cartella e sottocartelle

Problemi correlati