vscode visual studio instalar color code autocompletar visual-studio visual-studio-2010 msbuild msbuild-task appharbor

visual studio - visual - ¿Cuál es la diferencia entre un objeto PreBuildEvent, el objetivo BeforeBuild y el objetivo BeforeCompile en MSBuild?



visual studio code path intellisense (1)

Recientemente tuve que mover un código de un PreBuildEvent en Visual Studio al objetivo BeforeBuild para que funcione en AppHarbor . Al hacerlo, también noté un objetivo BeforeCompile.

¿Cuál es la diferencia entre estos tres eventos aparentemente similares: PreBuildEvent, BeforeBuild Target, BeforeCompileTarget?

¿Qué se puede / no se puede hacer con cada uno y por qué elegir uno sobre otro?


La respuesta a esta pregunta se puede encontrar en el archivo Microsoft.Common.targets que se puede encontrar (dependiendo de si está usando el marco de 64 bits o 32 bits) en: C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Microsoft.Common.target para 64 bits y C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Common.targets para el tiempo de ejecución de 32 bits. Este archivo define todos los pasos a los que se somete una construcción de su proyecto. Citando la fuente:

<!-- ============================================================ Build The main build entry point. ============================================================ --> <PropertyGroup> <BuildDependsOn> BeforeBuild; CoreBuild; AfterBuild </BuildDependsOn> </PropertyGroup>

El código es lo suficientemente bueno para explicar el uso del objetivo BeforeBuild y AfterBuild en los comentarios para ambos objetivos.

<!-- ============================================================ BeforeBuild Redefine this target in your project in order to run tasks just before Build ============================================================ --> <Target Name="BeforeBuild"/> <!-- ============================================================ AfterBuild Redefine this target in your project in order to run tasks just after Build ============================================================ --> <Target Name="AfterBuild"/>

Esto es seguido por la definición del objetivo CoreBuild :

<PropertyGroup> <CoreBuildDependsOn> BuildOnlySettings; PrepareForBuild; PreBuildEvent; ResolveReferences; PrepareResources; ResolveKeySource; Compile; UnmanagedUnregistration; GenerateSerializationAssemblies; CreateSatelliteAssemblies; GenerateManifests; GetTargetPath; PrepareForRun; UnmanagedRegistration; IncrementalClean; PostBuildEvent </CoreBuildDependsOn> </PropertyGroup>

Por lo tanto, el objetivo de Build es solo una envoltura alrededor del objetivo de CoreBuild para permitirle realizar pasos personalizados justo antes o después del objetivo de CoreBuild . Como se puede ver arriba, PreBuildEvent y PostBuildEvent se enumeran como dependencias del objetivo CoreBuild . Las dependencias del objetivo de Compile se definen de la siguiente manera:

<PropertyGroup> <CompileDependsOn> ResolveReferences; ResolveKeySource; SetWin32ManifestProperties; _GenerateCompileInputs; BeforeCompile; _TimeStampBeforeCompile; CoreCompile; _TimeStampAfterCompile; AfterCompile </CompileDependsOn> </PropertyGroup>

De nuevo BeforeCompile y BeforeCompile se comentan en el código:

<!-- ============================================================ BeforeCompile Redefine this target in your project in order to run tasks just before Compile. ============================================================ --> <Target Name="BeforeCompile"/> <!-- ============================================================ AfterCompile Redefine this target in your project in order to run tasks just after Compile. ============================================================ --> <Target Name="AfterCompile"/>

Dada esta información, no sé por qué AppHarbor no es compatible con Pre-, PostBuildEvent mientras que Build se puede modificar utilizando Before-, AfterBuild .

Elegir qué Target anular para qué escenario depende del momento durante la compilación en la que desea realizar su tarea determinada. Los objetivos no tienen restricciones específicas y / o beneficios en cuanto a lo que pueden lograr. Además del hecho de que pueden adaptar ItemGroup o propiedades que fueron definidas / completadas por pasos previos.

Usar nuget para traer paquetes probablemente se realice mejor antes de que la compilación intente resolver las dependencias de los proyectos. Entonces BeforeCompile no es un buen candidato para este tipo de acción.

Espero que esto arroje algo de luz sobre el asunto. Encontré otra buena explicación en MSDN