Я пытаюсь выполнить некоторые предварительные шаги для работы в проекте на С++ в Visual Studio 2012, но они не вызываются (хотя я уверен, что в Visual Studio 2010 одинаковые методы были в порядке). Строки командной строки ведут себя точно так же.
Это конец файла проекта; файл был сгенерирован с использованием Visual Studio, а затем я просто добавил последние пару строк:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="BeforeBuild">
<Message Text="### BeforeBuild ###" />
</Target>
<Target Name="BeforeCompile">
<Message Text="### BeforeCompile ###" />
</Target>
<Target Name="AfterBuild">
<Message Text="### AfterBuild ###" />
</Target>
и здесь вывод:
Project "d:\temp\temp.vcxproj" on node 1 (default targets).
InitializeBuildStatus:
Creating "Debug\temp.unsuccessfulbuild" because "AlwaysCreate" was specified.
AfterBuild:
AfterBuild
FinalizeBuildStatus:
Deleting file "Debug\temp.unsuccessfulbuild".
Touching "Debug\temp.lastbuildstate".
Поэтому учитывается только AfterBuild, а остальные игнорируются. В этом я нашел эту PropertyGroup в Microsoft.BuildSteps.targets:
<BuildDependsOn>
_PrepareForBuild;
$(BuildSteps);
AfterBuild;
FinalizeBuildStatus;
</BuildDependsOn>
Разве это не должно иметь объекты BeforeBuild и BuildEvent? Или что-то не так с моей установкой MSBuild, заставляя ее использовать этот файл BuildSteps.targets, а не что-то еще?
Решение
Как указывает Алексей, использование Before/AfterTarget позволяет использовать обходное решение. Вам просто нужно позаботиться о том, какие цели использовать, но это легко, посмотрев файл BuildSteps. На данный момент это работает нормально:
<Target Name="BeforeBuild" BeforeTargets="PrepareForBuild">
<Message Text="### BeforeBuild ###" />
</Target>
<Target Name="BeforeCompile" BeforeTargets="BuildCompile">
<Message Text="### BeforeCompile ###" />
</Target>
<Target Name="AfterBuild" AfterTargets="Build">
<Message Text="### AfterBuild ###" />
</Target>