StyleCop MS Build magic? Кто вызывает цель 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>
-->

Вопрос в том, почему это работает? Кто вызывает цель StyleCop, определенную в файле Microsoft.StyleCop.targets?

Насколько я могу судить, единственной целью, запускаемой при запуске сборки, является цель "Создать". Я не могу найти ссылки на цель "StyleCop" вне любого файла Microsoft.StyleCop.targets. Итак, почему это называется?

Я хочу знать, потому что было бы здорово, если бы мы могли сделать что-то подобное для наших собственных задач. Поэтому вместо редактирования всех наших 78 файлов csproj мы могли бы просто импортировать нашу общую цель, например:

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

А затем просто импортируйте StyleCop в этот файл вместе со всеми нашими другими задачами, которые необходимо выполнить для каждого проекта.

Пожалуйста, помогите мне понять.

Ответ 1

Эврика!

Секретный соус - это следующие строки в файле целей StyleCop:

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

Цель "Build" в Microsoft.Common.targets объявляется следующим образом:

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

Это означает, что любая цель, указанная в свойстве BuildDependsOn, будет вызвана во время сборки. Разве это не так хорошо?:)