2010-02-26 12 views
9

En nuestros archivos de proyecto, estamos utilizando StyleCop y lo estamos ejecutando durante el proceso de compilación. Hemos modificado nuestros archivos de proyecto para incluir los objetivos StyleCop así:StyleCop MS ¿Construir magia? ¿Quién llama el objetivo de StyleCop?

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" /> 
<Import Project="..\..\Tools\Microsoft\StyleCop\v4.3\Microsoft.StyleCop.targets" /> 
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
    Other similar extension points exist, see Microsoft.Common.targets. 
<Target Name="BeforeBuild"> 
</Target> 
<Target Name="AfterBuild"> 
</Target> 
--> 

La cuestión es por qué funciona esto? ¿Quién llama al objetivo StyleCop definido en el archivo Microsoft.StyleCop.targets?

Por lo que puedo decir, el único objetivo que se ejecuta cuando se inicia la compilación, es el objetivo "Compilar". No puedo encontrar ninguna referencia al objetivo "StyleCop" en ningún lugar fuera del archivo Microsoft.StyleCop.targets. Entonces, de nuevo, ¿por qué se llama?

La razón por la que quiero saber es porque sería genial si pudiéramos hacer algo similar para nuestras tareas personalizadas. Así que en lugar de editar todas las 78 archivos csproj, podríamos simplemente importar nuestro propio objetivo general, como:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" /> 
<Import Project="Common.targets" /> 

Y luego simplemente importar StyleCop en ese archivo en lugar, junto con todas las otras tareas que necesitan ser hechas en por proyecto.

Por favor, ayúdame a comprender.

Respuesta

9

Eureka!

El ingrediente secreto es las siguientes líneas en el archivo objetivos StyleCop:

<PropertyGroup> 
    <BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn> 
    <RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn> 
</PropertyGroup> 

El objetivo de "construir" en Microsoft.Common.targets se declara así:

<Target Name="Build" 
     Condition=" '$(_InvalidConfigurationWarning)' != 'true' " 
     DependsOnTargets="$(BuildDependsOn)" 
     Outputs="$(TargetPath)" /> 

Esto significa que cualquier objetivo enumerado en la propiedad "BuildDependsOn" se llamará durante la compilación. ¿No es lindo? :)