Подтвердить что ты не робот

Копировать всю папку MSbuild

пытается скопировать всю папку, но когда я это сделаю:

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

копия пытается сделать это: копировать c:\source\*. * c:\destination\SomeDir\*. * и терпит неудачу с "незаконными символами"

4b9b3361

Ответ 1

Укажите свою ItemGroup для SourceFiles явно.

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

Обратите внимание, что _CopyItems - это тип элемента, поэтому он ссылается на символ '@', а не на $.

Ответ 2

Глядя на документацию MSDN, я считаю, что для параметра SourceFiles требуется значение ITaskItem []. См. Задача MSBuild для копирования MSDN

Последний пример приведенной выше ссылки - сделать рекурсивную копию из одного каталога в другой, сохраняя структуру папок.

Ответ 3

Копирование файлов может выполняться с помощью следующего фрагмента кода, который обрабатывает антивирусные программы и подкаталоги

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

Задание $(OutputPath)\%(RecursiveDir) будет запрашивать задачу копирования для подпапок, поэтому она будет помещать подпапки исходного каталога во вложенные папки целевых каталогов.

SkipUnchangedFiles увеличит скорость сборки на компьютерах с достаточной памятью, поскольку Windows оптимизирует IO для часто используемых файлов, когда хватает ОЗУ.

Retries и RetryDelayMilliseconds обрабатывает связанные с этим проблемы a) Сжатая файловая система NTFS, когда сборка заканчивается неудачно в случаях b) Антивирусное программное обеспечение с дисками SSD.