From the MSBuild Team Blog

Have you ever run into a situation where you had to recursively copy files from one folder into another as a part of your build process?  We certainly have run into it a few times, and I thought I’d share with you a neat trick that involves the use of metadata and the Copy task.

Before you can copy a set of files, you need to be able to recursively add those files to an item list. Here’s how you do that when declaring items.

<ItemGroup>
      <Compile Include=".\**\*.cs" /> 
</ItemGroup>

The ** wildcard is used in item includes to indicate recursive includes.

So, once you have an item declared as such, you can rely on a piece of standard meta-data that goes with all items (i.e. RecursiveDir) to accomplish your recursive copy. The RecursiveDir metadata when used will return the evaluated value of the ** metadata for each item – and you can use that value to preserve the folder structure for each file when performing the copy. Here’s how you invoke the <Copy> task using this piece of metadata to copy recursively.

<Copy SourceFiles="@(Compile)" DestinationFolder="c:\foocopy\%(RecursiveDir)"></Copy>

Additional information can be found at the MSBuild Team Blog and the MSBuild Wiki.

Happy Visual Studio’ing!  Suggest a Tip of the Week!