Как скопировать файлы из dir1 в dir2 с именами, существующими только в dir2, используя только предопределенные задачи MSBuild

#visual-studio #msbuild

#visual-studio #msbuild

Вопрос:

У меня есть шаблон проекта, разархивированный в dir2 (с вложенными папками). И исходный проект шаблона в dir1 (с вложенными папками). Моя задача — обновить все файлы в dir2, которые поступили ранее из dir1, актуальными версиями файлов из dir1 (независимо от того, обновлены они или нет, для простоты). Когда я говорю «появились раньше», я имею в виду, что у них те же имена, что и у файлов в dir1.

Проблема в том, что в dir1 есть файлы, не существующие в dir2, и наоборот — и их нельзя копировать. И у dir1, и у dir2 есть вложенные папки, поэтому недостаточно просто скопировать файлы, существующие в обоих каталогах. Все они должны быть размещены точно в соответствующих подкаталогах в dir2.

Вопрос в том, возможно ли это сделать, не используя встроенные задачи (код C # / VB)? Я прекрасно понимаю, как это сделать на C # / VB, но это не идеальное решение, если я могу сделать это с помощью предопределенных задач MSBuild и функций свойств. НО — до сих пор я не нашел способ сделать это:-(.

Комментарии:

1. Может помочь свойство события сборки или задача Exec . Не зная тип вашего проекта, поэтому я не совсем уверен, поддерживает ли ваш тип проекта build-event. Но я думаю, что задача exec может удовлетворить ваши потребности.

2. И извините за последний комментарий, что-то не так со ссылкой Exec task.

Ответ №1:

Возможно ли это сделать, не используя встроенные задачи (код C # / VB)?

Это возможно. Нравится то, что я упомянул в комментарии. Свойство события сборки или задача Exec могут достичь этой цели.

Шаг 1:

Команда cmd xcopy pathDir1 pathDir2 /U /Y /E может работать так, как вы хотите.

/U Означает копировать только файлы, которые существуют в Dir2, в Dir2 из Dir1, точно так же, как обновление файлов с одинаковыми именами.(Это работает как для вложенных папок, так и для файлов)

Предложение: Используйте команду cmd, чтобы проверить, работает ли она перед шагом 2.

Шаг 2:

Для задачи Msbuild Exec. Поскольку теперь вы знакомы с msbuild, итак, вкратце:

 <Target Name="MyCopyCommand">
    <Exec Command="xcopy  pathDir1 pathDir2 /U /Y /E"/>
</Target>
  

Кроме того: Вы можете добавить содержимое команды в xx.bat и использовать его как:

 <Target Name="MyCopyCommand">
        <Exec Command="pathxx.bat"/>
</Target>
  

И не забывайте контролировать порядок назначения, используя DefaulTargets,AfterTargets, BeforeTargets, чтобы контролировать, когда запускать команду копирования.

Комментарии:

1. Рад узнать, что это помогает. Хорошего дня!

Ответ №2:

Извините, я не упомянул, что целевой каталог является подкаталогом исходного каталога. xcopy не сработал для меня в такой ситуации, даже когда я предоставил соответствующие / ИСКЛЮЧАЮЩИЕ параметры, я получил ошибку циклирования.

НО — я нашел чистое решение MSBuild, это мой вариант:

 <ItemGroup>
  <ProjectFiles Include="**" Exclude="obj**;bin**;bak**" />
  <TemplateIntputs Include="@(ProjectFiles)" Condition="Exists('$(IntermediateTemplateSUBPath)%(ProjectFiles.Identity)')" />
  <TemplateOutputs Include="@(TemplateIntputs->'$(IntermediateTemplateSUBPath)%(Identity)')" />
</ItemGroup>  
  

Ключом, очевидно, является функция «Существует».