#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>
Ключом, очевидно, является функция «Существует».