12 November 2010 HowTo, MSBuild, StyleCop Robert Muehsig

image

Code Quality ist ein großes Thema. StyleCop ist ein Tool von Microsoft (ein Open Source Tool btw. !) um den Source Code zu analysieren. Im Gegensatz zu FxCop oder gar der Code Analysis von VSTS prüft es den Code auf Einhaltung auf Codeing Conventions etc.. Hier ein Blogpost der die Unterschiede etwas mehr aufzeigt. Nichts desto trotz kann man recht einfach StyleCop mit in sein MSBuild integrieren und so evtl. sogar in sein Build Prozess zu nutze machen.

Vorraussetzugen

StyleCop - ich hab Version 4.4.0.14 RTW bei mir installiert.

Das Installationsverzeichnis von StyleCop:
C:\Program Files (x86)\Microsoft StyleCop 4.4.0.14

Bei der Installation müssen die Build Files mit installiert werden:

image

Es gäbe nun noch die Möglichkeit Stylecop ohne weitere Tools in MSBuild aufzurufen, das ist aber irgendwie nicht ganz so elegant und bietet nicht so viele Möglichkeiten. Siehe diesen Post vom StyleCop Team.

Etwas interessanter wird es mit dem MSBuild.Extension.Pack

Ich habe die MSBuild Extension Pack August 2010 Files mir runtergeladen. In diesem Zip Verzeichnis ist für uns eigentlich nur der "MSBuild.ExtensionPack.Binaries 4.0.1.0” Ordner von Interesse.

Unsere Demoanwendung

Jetzt müssen wir ein paar Files von den beiden Ordnern zusammenkopieren.

Meine Solution sieht so aus:

image

Im "Lib” Ordner sind 3 dlls aus dem StyleCop Ordner und die restlichen zwei Files stammen aus dem ExtensionPack.Binaries Ordner. Diese bitte in ein Verzeichnis kopieren.

 

 

 

Das Settings.StyleCop File, welches die "Rules” von StyleCop inne hat, kann man über das Visual Studio generieren:

image

Nach dem "Run StyleCop” befindet sich nun im Projekt Verzeichnis die StyleCop Datei.

Nun zum MSBuild

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Measure">
  <!--<Import Project="$(MSBuildStartupDirectory)\Lib\MSBuild.ExtensionPack.tasks"/>-->
  <UsingTask AssemblyFile="$(MSBuildStartupDirectory)\Lib\MSBuild.ExtensionPack.StyleCop.dll" TaskName="MSBuild.ExtensionPack.CodeQuality.StyleCop"/>
  <PropertyGroup>
    <OutDir>$(MSBuildStartupDirectory)</OutDir>
  </PropertyGroup>
  <Target Name="Measure">
    <Message Text="Measure called." />

    <CreateItem Include="$(MSBuildStartupDirectory)\**\*.cs">
      <Output TaskParameter="Include" ItemName="StyleCopFiles"/>
    </CreateItem>
    
    <MSBuild.ExtensionPack.CodeQuality.StyleCop
          TaskAction="Scan"
          ShowOutput="true"
          ForceFullAnalysis="true"
          CacheResults="false"
          SourceFiles="@(StyleCopFiles)"
          logFile="$(OutDir)\StyleCopLog.txt"
          SettingsFile="$(MSBuildStartupDirectory)\Settings.StyleCop"
          ContinueOnError="false">
          <Output TaskParameter="Succeeded" PropertyName="AllPassed"/>
          <Output TaskParameter="ViolationCount" PropertyName="Violations"/>
          <Output TaskParameter="FailedFiles" ItemName="Failures"/>
    </MSBuild.ExtensionPack.CodeQuality.StyleCop>
    <Message Text="Succeeded: $(AllPassed), Violations: $(Violations)" />
  </Target>

</Project>

In dem MSBuild File gibt es ein Target "Measure” und wir importieren das MSBuild Extension Pack File. Danach holen wir uns in Zeile 10 alle .cs Dateien. Dann kommt der eigenltiche Aufruf von dem MSBuild Extension Pack Stylecop Aufruf.

Als Rückgabe gibt es ein Bool namens "Succeeded” sowie einen Zähler. Über ein .bat File rufen wir einfach das MSBuild File auf.

Rauskommt ein Logfile + ein XML File, wo alle Warnungen drin sind. Dieses File lässt sich auch leicht weiterverarbeiten.

Momentan habe ich dies nur "lokal” getestet, aber es gibt Integrationen in Hudson und in den TFS.

Noch zwei weitere Links zum Thema:

[Download Democode]


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!