2010-02-26 38 views
9

在我們的項目文件中,我們使用StyleCop並在構建過程中運行它。我們已經修改了我們的項目文件,使其包含StyleCop目標,如下所示:StyleCop MS Build magic?誰在調用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> 
--> 

問題是爲什麼它這樣工作?誰在調用Microsoft.StyleCop.targets文件中定義的StyleCop目標?

據我所知,開始構建時運行的唯一目標是「構建」目標。我無法在Microsoft.StyleCop.targets文件的任何位置找到對「StyleCop」目標的任何引用。那麼,爲什麼它被稱爲?

我想知道的原因是因爲如果我們可以爲自己的自定義任務做類似的事情,那將會很酷。因此,而不是編輯所有的78個的csproj文件中,我們可以只導入我們自己的總目標,如:

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

然後在該文件中只導入了StyleCop相反,與需要在完成了我們的所有其他任務一起每個項目的基礎上。

請幫我理解。

回答

9

尤里卡!

的祕訣是在目標StyleCop的文件中的以下行:

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

在Microsoft.Common.targets「創建」的目標聲明,像這樣:

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

這意味着,在構建期間,「BuildDependsOn」屬性中列出的任何目標都將被調用。這不是很好嗎? :)