Копировать всю папку MSbuild
пытается скопировать всю папку, но когда я это сделаю:
<Copy SourceFiles="$(TargetDir)\*.*" DestinationFolder="$(BuildOutput)\SomeDir" />
копия пытается сделать это: копировать c:\source\*. * c:\destination\SomeDir\*. * и терпит неудачу с "незаконными символами"
Ответы
Ответ 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.