HowTo: StyleCop Settings auf mehrere Projekte anwenden
Ich hab bereits darüber gebloggt, wie man StyleCop im MSBuild Script verwenden kann. Allerdings möchte man eigentlich noch eine StyleCop Settings Datei haben und diese bei jedem Build im Visual Studio auch ausführen lassen. Dies geht mit relativ wenig aufwandt.
Ausgangspunkt
Als Ausgangspunkt nehmen wir die Solution vom letzten Blogpost. Das Stylecop File liegt bereits ausserhalb der Projekte.
Hinweis: Um ein “Default-Stylecop” File zu erzeugen einfach Stylecop installieren und Rechtsklick auf ein Projekt und “Run Stylecop” klicken. Dann wird im Projektverzeichnis ein Settings.Stylecop File erzeugt.
Die StyleCop Datei verlinken
Über Rechtsklick auf das Projekt und StyleCop Settings kann man eine StyleCop Datei auch verlinken:
Dort im zweiten Reiter kann man unser Settings.Stylecop verlinken:
Wenn man das gemacht hat, wird ein File im Projektverzeichnis abgelegt, allerdings wird es nicht im Projekt referenziert, also über “Show All Files” gehen und das File ins Projekt mit reinholen:
Inhaltlich steht das in dem File:
<StyleCopSettings Version="4.3">
<GlobalSettings>
<StringProperty Name="LinkedSettingsFile">..\Settings.StyleCop</StringProperty>
<StringProperty Name="MergeSettingsFiles">Linked</StringProperty>
</GlobalSettings>
</StyleCopSettings>
Recht einleuchtend.
Das ganze in allen Projekten wiederholen…
Und nun, damit beim Bauen auch der StyleCop anspringt: Projekt Dateien bearbeiten
Damit bei jedem Bauvorgang auch der Code gecheckt wird, muss das Projektfile bearbeitet werden. Das Stylecop Target muss noch eingefügt werden.
Wenn man, wie in meiner Beispielanwendung, alle Stylecop Daten aus dem Installationsverzeichnis mit in die Solution holt, funktioniert es bei allen Projektmitgliedern, egal ob sie Stylecop installiert haben oder nicht.
Die StyleCop Targets Datei finden sie (wenn Sie bei der Installation die MSBuild Files nicht abgewählt habe) hier:
C:\Program Files (x86)\MSBuild\Microsoft\StyleCop\v4.4
Den gesamten Ordner hab ich mit in das Solution Verzeichnis kopiert.
Nun das csproj File anpassen:
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> ... <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="..\Lib\Microsoft.StyleCop.targets"/> ... </Project>
Die zweite Import Anweisung ist für das aktivieren von Stylecop zuständig. Die Position ist auch nicht ganz unwichtig. Als ich die Importanweisung in die erste Zeile geschrieben hatte, war kein Ergebnis zusehen.
Nach dem Import des Target Files in allen Projekten ist man fertig.
Diese Vorgehensweise stammt aus dem StyleCop Teamblog:
Wenn man die Stylecop Verletzungen als Error anstatt als Warning ausgeben möchte, dann kann man dies ebenfalls im csproj File einstellen. Dazu muss bei der jeweiligen Build Konfiguration dieser Parameter mit angegeben werden:
<StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
Fazit
Die EInbindung von Stylecop kann durchaus Sinn machen. Je nach Anforderung und Projekt muss man aber schauen welche Regeln wirklich sinnvoll sind oder nicht. Die Regeln kann man durch ein zentrales StyleCop File einfacher verwalten und nach dem initialen aufsetzen der Projekte/Solution macht es sich auch bezahlt, weil man bei jedem Build daran erinnert wird – egal ob von MSBuild oder über Visual Studio.







Joachim
18. November 2010
Wieso linkst Du die Stylecop Settings in alle Projekte rein? Hat eigentlich nur Sinn wenn man in den Projekten unterschiedliche Settings verwenden will. Ansonsten reicht das Settings File auf Solutionebene völlig aus.
Robert Mühsig
18. November 2010
Ich hatte bei mir das Phänomen, dass ich zwar ein Settings.stylecop File in der Solution definiert hatte, er dies aber in den Projekten ignoriert hat und stattdessen die Default Settings nahm. Daher war jetzt mein Workaround überall explizit dass “Solution Settings.stylecop” File zu nehmen. Daher das verlinken.
Joachim
18. November 2010
Interessant. Bei mir hat Stylecop die Option “Merge with the following settings” nicht immer verstanden. Ob es funktioniert hat oder nicht war wohl abhängig vom Pfad der referenzierten Settings (sehr suspekt). Die jetzige Lösung funktioniert jedenfalls. Wir haben einmal globale Settings für das ganze Unternehmen, die liegen jeweils in einer Struktur für globale Daten im Branch. Die werden dann per “Merge with the following settings” von den Settings auf Solutionebene (hier funktioniert das) in die Folder- Hierarchie der Solutions geholt und dann per Default über die Hierarchie ohne weiteres zutun in den Projekten verwendet.