Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MSbuild Copy whole folder

Trying to copy a whole folder, but when I do this:

<Copy SourceFiles="$(TargetDir)\*.*" DestinationFolder="$(BuildOutput)\SomeDir" />

the copy attempts to do this: copy c:\source\. c:\destination\SomeDir\. and fails with illegal characters error

like image 991
Sonic Soul Avatar asked Feb 25 '11 23:02

Sonic Soul


4 Answers

Specify your ItemGroup for SourceFiles explicitly.

<ItemGroup>
    <_CopyItems Include="$(TargetDir)\*.*" />
</ItemGroup>
<Copy
    SourceFiles="@(_CopyItems)"
    DestinationFolder="$(BuildOutput)\SomeDir"
    />

Note that _CopyItems is an item type, so it's referenced using '@' symbol rather than '$'.

like image 174
Brian Kretzler Avatar answered Nov 19 '22 08:11

Brian Kretzler


Copying files can be done with the following code snippet which handles antivirus programs and subdirectories

  <ItemGroup>
        <SomeAppStuff Include="$(SolutionDir)\ProjectXXX\bins\**\*.*" />
  </ItemGroup>
  <Copy 
      SourceFiles="@(SomeAppStaff)" 
      DestinationFolder="$(OutputPath)\%(RecursiveDir)" 
      SkipUnchangedFiles="true"
      OverwriteReadOnlyFiles="true" 
      Retries="3"
      RetryDelayMilliseconds="300"/>

Specifying $(OutputPath)\%(RecursiveDir) will ask Copy task to respect subfolders, so it will place subfolders of source directory to subfolders of target directories.

SkipUnchangedFiles will increase build speed on computers with enough memory, because Windows optimizes IO for frequently used files when there's enough RAM.

Retries and RetryDelayMilliseconds handles issues related a) Compressed NTFS file system, when builds fails in seldom cases b) Antivirus Software with SSD drives.

like image 27
Siarhei Kuchuk Avatar answered Nov 19 '22 08:11

Siarhei Kuchuk


If you put the folder in the root of your c# project then you can simple put this in your csproj.

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

I have only tested in the 2017 version of csproj, but I assume it's backwards compatible. Could be wrong on that though

like image 35
Terence Avatar answered Nov 19 '22 08:11

Terence


Looking at the MSDN documentation, I believe the SourceFiles parameter requires an ITaskItem[] value. See MSDN MSBuild Copy Task

The last example on the above link is to do a recursive copy from one directory to another, maintaining the folder structure.

like image 14
RichTea Avatar answered Nov 19 '22 08:11

RichTea