2010-02-26 5 views
9

Dans nos fichiers de projet, nous utilisons StyleCop et l'exécutons pendant le processus de construction. Nous avons modifié nos fichiers de projet pour inclure les cibles StyleCop comme suit:StyleCop MS Construire la magie? Qui appelle la cible 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 question est pourquoi cela fonctionne-t-il? Qui appelle la cible StyleCop définie dans le fichier Microsoft.StyleCop.targets?

Pour autant que je sache, la seule cible en cours d'exécution lorsque vous démarrez la build est la cible "Build". Je ne trouve aucune référence à la cible "StyleCop" en dehors du fichier Microsoft.StyleCop.targets. Encore une fois, pourquoi est-ce qu'on l'appelle?

La raison pour laquelle je veux savoir est parce que ce serait cool si nous pouvions faire quelque chose de similaire pour nos propres tâches personnalisées. Ainsi, au lieu d'éditer tous nos 78 fichiers csproj, nous pourrions importer notre propre objectif général comme:

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

Et puis importer simplement StyleCop dans ce fichier à la place, ainsi que tous les autres tâches qui doivent être effectuées sur un par projet.

S'il vous plaît aidez-moi à comprendre.

Répondre

9

Eureka!

La sauce secrète est les lignes suivantes dans le fichier cible StyleCop:

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

L'objectif "Build" dans Microsoft.Common.targets est déclarée comme ceci:

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

Cela signifie que toute cible répertoriée dans la propriété "BuildDependsOn" sera appelée pendant la construction. C'est pas gentil? :)