StyleCop MS Строить магию? Кто вызывает цель StyleCop? - PullRequest
9 голосов
/ 26 февраля 2010

В наших файлах проекта мы используем 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 Ответ

9 голосов
/ 28 февраля 2010

Эврика!

Секретный соус - это следующие строки в файле целей 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, будет вызываться во время сборки. Разве это не мило? :)

...