Friday 26 July 2013

StyleCop and R# Integration

StyleCop and R# Integration

You can either write your own rule library or use an existing extension like StyleCop+. I’ve used StyleCop+ as it holds common rules and is an open source community project so adding to it is easy. I’ve investigate the StyleCop+ rule SP2101 MethodMustNotContainMoreLinesThan below.

Versions

Visual Studio 2010
R# 5.1.3000.12 and 8.0.14.856
StyleCop 4.7.44.0 and 4.7.45.0
StyleCop+ 1.8

R# 8 and StyleCop with StyleCop+

R#8 will NOT work with StyleCop 4.7.44.0 only 4.7.45.0. If you want to use StyleCop+ 1.8 on top of this you need to change the assembly binding redirects in the Visual Studio 2010 config file (C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.config).

Make sure VS is closed and the StyleCopPlus.dll in C:\Program Files (x86)\StyleCop 4.7 has been deleted.

Under this XML...

       <runtime>
              <UseSmallInternalThreadStacks enabled="true"/>

              <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

Add this XML...

<dependentAssembly>
          <assemblyIdentity name="StyleCop" publicKeyToken="f904653c63bc2738" />
          <bindingRedirect oldVersion="4.5.0.0-4.5.99.99" newVersion="4.7.45.0" />
      </dependentAssembly>
      <dependentAssembly>
          <assemblyIdentity name="StyleCop.CSharp" publicKeyToken="f904653c63bc2738" />
          <bindingRedirect oldVersion="4.5.0.0-4.5.99.99" newVersion="4.7.45.0" />
      </dependentAssembly>
      <dependentAssembly>
          <assemblyIdentity name="StyleCop.CSharp.Rules" publicKeyToken="f904653c63bc2738" />
          <bindingRedirect oldVersion="4.5.0.0-4.5.99.99" newVersion="4.7.45.0" />

      </dependentAssembly>

Place the StyleCopPlus.dll back in C:\Program Files (x86)\StyleCop 4.7  and Unblock it.  Now open VS and everything should work!

R# Integration

With these versions installed you can edit the StyleCop+ rule SP2101 to reduce the lines from 120 to 20 to test its working. Open Settings.StyleCop file (Located in folder of project(s) or solution) then go to the StyleCop+ tab and select the rules to edit.



Open the R# options dialog and go to Code Inspection > Inspection Severity and find the StyleCop+ rule to show as an error.



An you’re done!

Build Integration

You can use the MSBuild targets file (e.g. C:\Program Files (x86)\MSBuild\StyleCop\v4.7\StyleCop.Targets) provided with StyleCop to fail the build in Visual Studio for any of the projects you set this up for. The problem with this is all violations are set to error and you can’t target individual rules to break the build.

The solution I think is to use TeamCity to read the XML violations file (e.g. \obj\Debug\StyleCopViolations.xml) generated after the build and then fail the CI build if it finds an individual rule violation. For example if you find this in the file:

<Violation LineNumber="19" Source="C:\DevelopmentSVN\ATMS\Trunk\Isotrak.Zinc\Isotrak.Zinc.ATMS\Common\MapModelHelper.cs" RuleNamespace="StyleCopPlus.StyleCopPlusRules" Rule="MethodMustNotContainMoreLinesThan" RuleId="SP2101">Method body must not contain more than 20 code lines (now 25).</Violation>