在我们的项目文件中,我们正在使用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>
-->
问题是为什么这有效?谁在调用Microsoft.StyleCop.targets文件中定义的StyleCop目标?
据我所知,启动构建时唯一运行的目标是“Build”目标。我无法在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" />
然后只需在该文件中导入StyleCop,以及需要在每个项目基础上完成的所有其他任务。
请帮助我理解。
答案 0 :(得分:9)
尤里卡!
秘诀是StyleCop目标文件中的以下几行:
<PropertyGroup>
<BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn>
<RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn>
</PropertyGroup>
Microsoft.Common.targets中的“Build”目标声明如下:
<Target Name="Build"
Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
DependsOnTargets="$(BuildDependsOn)"
Outputs="$(TargetPath)" />
这意味着在构建期间将调用“BuildDependsOn”属性中列出的任何目标。不是很好吗? :)