如何在TeamCity中使用StyleCop

19

你是否在使用 MSBuild 作为你的构建运行程序? - devdigital
我正在使用Visual Studio SLN运行器。 - lysergic-acid
在@Benjol的答案中,有一个非常有帮助的评论被埋没了:“我做的另一件愚蠢的事情是没有仔细阅读自述文件:你必须解压下载的zip文件,并使用其中的zip文件。” - 这让我陷入了困境! - Jon H
4个回答

16

我不知道你对MSBuild有多熟悉,但是你应该能够在TC 6及以上版本中添加一个新的构建步骤,并将MSBuild设置为构建运行程序,并指向一个类似于以下内容的.proj文件:

<Target Name="StyleCop">

  <!-- Create a collection of files to scan -->
  <CreateItem Include="$(SourceFolder)\**\*.cs">
    <Output TaskParameter="Include" ItemName="StyleCopFiles" />
  </CreateItem>

  <StyleCopTask
    ProjectFullPath="$(MSBuildProjectFile)"
    SourceFiles="@(StyleCopFiles)"
    ForceFullAnalysis="true"
    TreatErrorsAsWarnings="true"
    OutputFile="StyleCopReport.xml"
    CacheResults="true" />

  <Xslt Inputs="StyleCopReport.xml"
     RootTag="StyleCopViolations" 
     Xsl="tools\StyleCop\StyleCopReport.xsl"
     Output="StyleCopReport.html" />

  <XmlRead XPath="count(//Violation)" XmlFileName="StyleCopReport.xml">
    <Output TaskParameter="Value" PropertyName="StyleCopViolations" />
  </XmlRead>

  <Error Condition="$(StyleCopViolations) > 0" Text="StyleCop found $(StyleCopViolations) broken rules!" />

</Target>

如果您不想因StyleCop错误导致构建失败,那么将Error任务设置为Warning即可。

此外,您还需要在.proj文件中添加以下内容:

<UsingTask TaskName="StyleCopTask" AssemblyFile="$(StyleCopTasksPath)\Microsoft.StyleCop.dll" />

Microsoft.StyleCop.dll包含在StyleCop安装中,您需要适当设置路径。

要在TeamCity中查看输出的StyleCop结果,您需要使用适当的.xsl文件(上面脚本中称为StyleCopReport.xsl)将.xml StyleCop报告转换为HTML。

要在TeamCity中显示HTML文件,您需要从此.html输出创建一个artifact,然后将该artifact包含在构建结果中

.NET中的持续集成书籍是一个很好的资源。


我可以像你展示的那样,将我的根路径作为Include,然后它会递归地在所有子文件夹下查找.cs文件吗?另外,我的原始问题是,这将如何显示在TeamCity报告中? - lysergic-acid
1
在StyleCop的最新版本(4.7)中,StyleCopTask已经移动到“StyleCop.dll”,因此使用方式现在看起来像这样: <UsingTask TaskName="StyleCopTask" AssemblyFile="$(StyleCopTasksPath)\StyleCop.dll" /> - mironych

6

你知道TeamCity提供了仅限于MSBuild的特定属性吗?不需要服务消息,详见:http://confluence.jetbrains.net/display/TCD65/MSBuild+Service+Tasks

因此,您无需添加自定义报告页面。可以使用构建统计信息等。

<TeamCitySetStatus Status="$(AllPassed)" Text="Violations: $(StyleCopViolations)" />

然后您也可以记录统计信息:

<TeamCityReportStatsValue Key="StyleCopViolations" Value="$(StyleCopViolations)" />

然后创建一个自定义图形以显示,您已经在msbuild输出中拥有了违规信息。 编辑main-config.xml并添加:

<graph title="Style Violations" seriesTitle="Warning">
   <valueType key="StyleCopViolations" title="Violations" buildTypeId="bt20"/>
 </graph>

其中 buildTypeId="bt20",bt20 是您的自定义构建。


好的,我会去查看一下。有没有办法在 TC 图形界面中也做到这一点? - lysergic-acid
前两个是针对常规的msbuild,您需要在每个上使用条件,以便它不会破坏任何手动构建-仅在运行时在tc内部工作。图形内容是服务器配置文件夹上的文本编辑。 - James Woolfenden

5
我来晚了,但实现这一点的非常简单的方法是在希望使用StyleCop分析的任何项目中安装StyleCop.MSBuild NuGet包。
安装完该包后,在进行每个构建时,无论在何处或如何调用(例如:VS、命令行、MSBuild、Psake、Rake、Fake、Bake、Nant、构建服务器等),StyleCop分析都将运行。因此,不需要任何特殊操作。
如果您希望当违反StyleCop规则时,构建失败,只需在每个适当的构建配置下向项目文件添加以下元素,例如:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
    ...

无论在何处以及如何调用,这都适用于每个版本。


很酷,但是对于每个项目都要添加还是有点繁琐,你觉得呢? - lysergic-acid
您可以像添加其他NuGet包一样,一次性将该程序包添加到解决方案中的所有项目中。如果您希望构建在违规时失败,则必须手动将该元素添加到每个项目中。但是,该步骤是可选的 - 在被接受的答案中,有一个强制的每个项目手动步骤;-) - Adam Ralph
1
@AdamRalph,使用这种方法,您如何将StyleCop分析的结果输出到TeamCity中以可视化查看是否存在任何错误?谢谢! - Gary Ewan Park
1
我没有做任何特别的事情。我只是让消息进入日志并从那里检查它们。在我的日常工作中,我们会因违规而失败构建,所以我们被迫仔细检查日志并修复它们。对于开源软件,我会让它们通过,并在本地使用VS时修复它们。 - Adam Ralph
明白了,这很有道理。你永远不应该提交任何在你自己的机器上本地构建失败的东西,那么在TeamCity中报告结果有什么意义呢?我可以接受这个。谢谢! - Gary Ewan Park

3

有一个(新的?)第三方TeamCity插件,用于StyleCop 这里,(尽管我还没有尝试过)。

更新:据我所知,最新版本只适用于TeamCity 7(或者我做错了什么)。此外,我的构建服务器非常慢(虚拟机),即使服务已重启,也需要一段时间才能在Web界面中显示StyleCop运行程序。

我做的另一件傻事是没有仔细阅读自述文件:您必须解压下载的zip文件,并使用其中的zip

我最初只是在“包含”选项(用于构建步骤)中列出了.cs文件的列表,但那不起作用;然而链接到sln或csproj文件确实有效。


除非像你一样做错了什么,否则在TC8中无法工作。指示是错误的,因为下载中没有stylecop.zip文件,你必须自己制作。无论如何,它都不起作用... - Jammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接