В наших файлах проекта мы используем 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 в том файле вместо этого, наряду со всеми нашими другими задачами, которые должны быть сделаны на на основание проекта.
Помогите мне понять.
Эврика!
Секретом являются следующие строки в файле целей 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» будет вызываться во время сборки. Разве это не хорошо? :)