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