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, будет вызвана во время сборки. Разве это не так хорошо?:)