2010-02-26 36 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”属性中列出的任何目标都将被调用。这不是很好吗? :)