У меня есть решение с несколькими проектами C ++.Для некоторых проектов мне нужна некоторая пользовательская копия файла, например, чтобы скопировать некоторые файлы конфигурации в выходной каталог или скопировать выходные файлы одного проекта в определенную папку после сборки.
В некоторых случаях я не 'Не хотите или не можете добавить эти файлы в проекты напрямую через Visual Studio IDE.Я создал простые файлы .targets, которые я могу использовать повторно и добавлять в проекты, которые требуют копирования файлов.
Вот простой пример файла .targets для копирования файлов конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
CopyCustom
</BuildDependsOn>
</PropertyGroup>
<ItemGroup>
<CustomFiles Include="$(ProjectDir)Config\**\*.xml" />
</ItemGroup>
<PropertyGroup>
<DestCustFolder>$(OutDir)Config\</DestCustFolder>
</PropertyGroup>
<Target Name="CopyCustom"
Inputs="@(CustomFiles )"
Outputs="@(CustomFiles ->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')">
<Message Text="Copy custom files..." />
<Copy SourceFiles="@(CustomFiles )" DestinationFiles="@(CustomFiles->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')" SkipUnchangedFiles="true" />
</Target>
</Project>
Через диалоговое окно «Настройка сборки» в Visual Studio я добавляю его в проект, чтобы он был включен какэто в конце файла проекта:
<ImportGroup Label="ExtensionTargets">
<Import Project="..\Targets\CopyCustom.targets" />/
</ImportGroup>
Это должно включить инкрементную сборку моей пользовательской цели.Если я просто отредактирую один из моих пользовательских файлов (и ни один из файлов C ++) и соберу его из консоли с помощью
msbuild foo1.vcxproj
, он фактически обнаружит изменения и выполнит инкрементную сборку для моей пользовательской цели.Если никакие изменения не вносятся, цель пропускается.
Если я все же собираю внутри Visual Studio, он не обнаружит изменения в пользовательских файлах и только и сообщит мне, что проект соответствует данным:
========== Build: 0 succeeded, 0 failed, 5 up-to-date, 0 skipped ==========
Мне пришлось бы дополнительно изменить один из файлов C ++, чтобы он снова проверил все цели и добавочную сборку.
Я ожидал, что Visual Studio просто выполнит MSBuild, который затем выполнитактуальная проверка проектов, поэтому она должна быть такой же, как и запуск MSBuild из консоли.Я пытался получить больше информации, устанавливая уровень многословия для диагностики, но я просто получаю ту же строку.Мне кажется, что MSBuild даже не выполняется для проекта, но сама Visual Studio определяет, что проект является современным.
Поэтому мне было интересно, как Visual Studio фактически определяет, когда он должен выполнять MSBuild дляпроект.
Я задавал в основном тот же вопрос раньше на форуме MSDN , но не смог получить четкий ответ.