msbuild visual-studio-2012

msbuild - ¿Qué pasó con BeforeBuild y otros objetivos en VS2012?



visual-studio-2012 (1)

Tengo los mismos objetivos de msbuild que describiste, así que creo que tu instalación de msbuild está bien. Parece que deciden limpiar los objetivos y las dependencias (no estoy seguro de si este problema está relacionado con la versión de VS, VS solo usa los mismos objetivos, proporcionada por msbuild). BeforeBuild y otros objetivos aún existen en Microsoft.common.targets. Supongo que solo se reservó para proyectos .NET (nunca jugué con C ++, así que no sé construir el pipeline allí).

De todos modos, ya sea que funcione o no en versiones anteriores, su problema puede resolverse de forma mucho más sencilla: simplemente use los nuevos atributos BeforeTargets / AfterTargets para MSBuild 4.0 y conecte sus objetivos directamente en lo que desee:

<Import Project="$(VCTargetsPath)/Microsoft.Cpp.targets" /> <Target Name="BeforeBuild" BeforeTargets="Build"> <Message Text="### BeforeBuild ###" Importance="high" /> </Target> <Target Name="BeforeCompile" BeforeTargets="Compile"> <Message Text="### BeforeCompile ###" Importance="high" /> </Target> <Target Name="AfterBuild" AfterTargets="Build"> <Message Text="### AfterBuild ###" Importance="high" /> </Target>

Estoy tratando de obtener algunos pasos previos a la construcción para trabajar en un proyecto de C ++ en Visual Studio 2012, pero no se invocan (aunque estoy bastante seguro de que las mismas técnicas estaban bien en Visual Studio 2010). Las compilaciones de línea de comando se comportan exactamente igual.

Este es el final del archivo de proyecto; el archivo se generó usando Visual Studio y luego agregué las últimas dos líneas:

<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>

y aquí está la salida:

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".

Entonces solo AfterBuild es considerado y los otros son ignorados. Al analizar esto, encontré este PropertyGroup en Microsoft.BuildSteps.targets:

<BuildDependsOn> _PrepareForBuild; $(BuildSteps); AfterBuild; FinalizeBuildStatus; </BuildDependsOn>

¿No debería esto también tener BeforeBuild y los objetivos de BuildEvent? ¿O algo está mal con mi instalación de MSBuild que hace que use este archivo BuildSteps.targets en lugar de algo más?

Solución

Como señala Alexey, el uso de Before / AfterTarget proporciona una solución utilizable. Solo tiene que preocuparse por los objetivos que debe usar, pero esto es fácil al mirar el archivo BuildSteps. Esto parece funcionar bien por ahora:

<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>