StyleCop MS Build魔术?谁在调用StyleCop目标?

Joh*_*esH 9 msbuild stylecop

在我们的项目文件中,我们使用StyleCop并在构建过程中运行它.我们修改了项目文件以包含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>
-->
Run Code Online (Sandbox Code Playgroud)

问题是为什么这有效?谁在调用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" />
Run Code Online (Sandbox Code Playgroud)

然后只需在该文件中导入StyleCop,以及需要在每个项目基础上完成的所有其他任务.

请帮我理解.

Joh*_*esH 9

找到了!

秘密酱是StyleCop目标文件中的以下行:

<PropertyGroup>
  <BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn>
  <RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

Microsoft.Common.targets中的"Build"目标声明如下:

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

这意味着在构建期间将调用"BuildDependsOn"属性中列出的任何目标.不是很好吗?:)