MSbuild скопировать всю папку - PullRequest
33 голосов
/ 26 февраля 2011

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

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

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

Ответы [ 6 ]

59 голосов
/ 26 февраля 2011

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

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

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

25 голосов
/ 05 июня 2016

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

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

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

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

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

14 голосов
/ 26 февраля 2011

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

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

6 голосов
/ 14 июня 2018

Если вы поместите папку в корень вашего c # проекта, вы можете просто поместить это в ваш csproj.

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

Я тестировал только версию 2017 csproj, но я предполагаю, что она обратно совместима. Может быть, неправильно в этом, хотя

2 голосов
/ 16 марта 2018

Успешно выполнить эту задачу, как эта

<Target Name="AfterBuild">
  <ItemGroup>
    <SomeDir Include="$(SolutionDir)\SomeOtherProject\SomeDir\**\*" />
  </ItemGroup>
  <Copy 
    SourceFiles="@(SomeDir)" 
    DestinationFiles="@(SomeDir->'$(OutDir)\SomeDir\%(RecursiveDir)%(Filename)%(Extension)')" 
    SkipUnchangedFiles="true" 
    OverwriteReadOnlyFiles="true" 
    Retries="3" 
    RetryDelayMilliseconds="300" />

0 голосов
/ 01 ноября 2018

Для меня то, что сработало, было так: - сохранил структуру папок - скопированы все файлы в папке - работает для любой папки, не должен находиться в проекте или в той же папке проекта

<ItemGroup>
    <_CopyItems Include="<path relative to project>\**\*.*" />
</ItemGroup>

<Target Name="AfterBuild">
  <Copy SourceFiles="@(_CopyItems)" DestinationFiles="@(_CopyItems->'$(OutDir)\<output folder>\%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>

Легенда:

  • <path relative to project>: это может быть любой путь, используя .. \ for зайдя над папкой proj работает
  • <output folder>: нужная папка вся файловая структура, которую нужно поместить, за исключением источника папка.
  • $(OutDir) будет bin \ Debug или любой другой режим сборки, если вы хотите что-то иначе измени это.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...