events build msbuild

¿Puede evitar que MSBuild.exe ejecute Build Events?



(9)

Estoy creando varios proyectos a través de un script, y el uso ocasional de eventos de compilación personalizados causa una gran dificultad para el sistema de compilación. Si es posible, me gustaría invocar MSBuild.exe para bloquear la ejecución de cualquier evento de compilación. A largo plazo, esto no es un problema para la automatización de compilación: los usuarios de proyectos con eventos de compilación son advertidos de que tal complicidad va contra las reglas.

En resumen, ¿hay alguna manera de llamar a MSBuild que impida la ejecución de cualquier paso de compilación personalizado, si está presente?

ACTUALIZAR:

Consideré realizar una edición in situ (automatizada) de los archivos del proyecto, pero preferiría el equivalente de la línea de comandos de establecer "Excluido de la compilación" (ver las opciones de Crear eventos) en Sí para cada uno de los tres eventos.


De forma predeterminada, cuando importas Microsoft.Common.targets obtienes

<PropertyGroup> <BuildDependsOn> BeforeBuild; CoreBuild; AfterBuild </BuildDependsOn> </PropertyGroup>

Creo que quizás puedas simplemente reemplazarlo con

<PropertyGroup> <BuildDependsOn> CoreBuild </BuildDependsOn> </PropertyGroup>

para desactivar estos eventos de compilación pre / post. (No estoy seguro si necesita poner eso en su archivo .proj antes o después de la importación, o si necesita modificar Microsoft.Common.targets para tener tal efecto. No tiene tiempo para experimentar en este momento ...)


En algunos proyectos de C #, necesito que PostBuildEvent funcione en Visual Studio Build, pero no funciona en MSBuild y TFS. Para este propósito agrego PostBuildEvent en VS. Establece el código siguiente en .csproj:

<PropertyGroup> <PostBuildEvent>*... my custom post build event ....*</PostBuildEvent> </PropertyGroup>

después de eso agrego los códigos a continuación a .csproj:

<Target Name="BeforeBuild"> <PropertyGroup Condition="''$(BuildingInsideVisualStudio)'' == ''false'' Or ''$(BuildingInsideVisualStudio)'' != ''true''"> <PostBuildEvent></PostBuildEvent> </PropertyGroup> </Target>

Este código establece PostBuildEvent como vacío y se produce solo en MSBuild y TFSBuild BeforeBuild target. Es simple, permanente, no necesita establecer parámetros y funciona bien.


Lo que haría sería definir un nuevo archivo .proj, digamos C: / Data / SupressBuildEvents.proj y contendría:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="PostBuildEvent"/> <Target Name="PreBuildEvent" /> </Project>

Luego debe especificar que estos archivos se importen después de Microsoft.Common.targets y lo haría definiendo la bien conocida propiedad CustomAfterMicrosoftCommonTargets en la ruta de ese archivo. Así que permite que tu script de compilación esté en un archivo llamado MyBuild.proj lo invocarías como:

msbuild MyBuild.proj /p:CustomAfterMicrosoftCommonTargets="C:/Data/SupressBuildEvents.proj "

Esto causará que MSBuild importe su archivo después de importar el archivo Microsoft.Common.targets y anulará los objetivos PostBuildEvent y PreBuildEvent y hará que no hagan nada.

Ahora, si sus archivos MyBuild.proj usan la tarea MSBuild para compilar otros objetivos, también debe pasarles esta propiedad de la siguiente manera:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ProjectsToBuild Include=" FILL THIS IN "/> </ItemGroup> <Target Name="YourTarget"> <MSBuild Projects="@(ProjectsToBuild)" Properties="CustomAfterMicrosoftCommonTargets=$(CustomAfterMicrosoftCommonTargets)"/> </Target> </Project>

Esto es necesario porque las propiedades de diseño en el script primario no se pasan a las compilaciones ejecutadas por la tarea MSBuild.


Parece que la respuesta es diferente según el tipo de proyecto.

Para proyectos C / C ++ (.vcxproj), puede suprimir PostBuildEvent en la línea de comando con /p:PostBuildEventUseInBuild=false , como sugiere AndreiM.

(Setting /p:PostBuildEvent en una cadena vacía no funciona para proyectos C ++, y no puedo encontrar ninguna otra forma de anular el comando post-build).

Para los proyectos de C # (.csproj), puede suprimir PostBuildEvent en la línea de comando con /p:PostBuildEvent= , como sugieren la mayoría de los otros respondedores.


Pre / PostBuildEvents son propiedades, por lo que para anularlas simplemente configúrelas desde la línea de comando hasta la cadena vacía.

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=


También jugué un poco con msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent= , pero para mí no funcionó, probablemente porque estoy usando archivos personalizados de utilería.

Sin embargo, lo que descubrí que funcionaba era /p:PostBuildEventUseInBuild=false


También podría hacer que la propiedad sea condicional

<PreBuildEvent Condition="''$(BuildingInsideVisualStudio)'' == '''' Or ''$(BuildingInsideVisualStudio)'' == true"> ... </PreBuildEvent>


También puede establecer las propiedades dentro de su MSBuild-tarea:

<MSBuild Projects="$(MSBuildProjectDirectory)/YourProject.csproj" Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent=" ContinueOnError="false" />


<Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition="''$(VisualStudioDir)'' != ''''">

Agregar esta condición al objetivo para PreBuild en el archivo csproj del proyecto es la única solución que funcionó para mí. Me encontré con este problema tratando de automatizar una compilación dentro de VSTS donde quería omitir el evento PreBuild definido en el archivo csproj del proyecto. Usando Visual Studio 2017, un proyecto .NET Core 2.0.

Probé las sugerencias de línea de comandos de msbuild que se enumeran aquí, pero ninguna de ellas me funcionó.