2009-08-18 7 views
5

Ich bin gebeten worden, StyleCop in unserem CI Build-Prozess so zu integrieren, dass:StyleCop Integration mit CI Build-Prozess (Criuse Kontrolle, Nant, msbuild und StyleCop)

  • Individuelle Projektdatei in unserer (groß) Lösung ist nicht betroffen
  • ich jede dritte Partei Werkzeug nicht

die erste Anforderung (und ich ist darauf zurückzuführen zu verwenden, um diese noch nicht vollständig verstehen) die Tatsache, dass wir don‘ Ich möchte StyleCop auf unserer gesamten Website ausführen Lösung direkt aus. Wenn StyleCop innerhalb von VS ausgeführt wird, ignoriert es offenbar bestimmte Attribute, die zu ignorierende Dateien angeben. Aus diesem Grund werden wir, wenn wir es auf den Dev-Maschinen laufen lassen, ständig von Tausenden von Verstößen getroffen werden, mit denen wir noch nicht fertig sind. Im Endeffekt wollen wir es nur auf dem Build-Server ausführen können.

Unsere Build-Umgebung besteht derzeit aus:

Tempomat> Nant Aufgabe, die msbuild (via exec)

Nant Aufgabe unten ausgeführt wird, ist:

<target name="buildSolution">  
    <echo message="Building solution..." /> 
    <exec program="C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe"      
     commandline="${Project.SolutionFile} /t:Rebuild /p:Configuration=${Project.SolutionBuildConfiguration} /v:q" workingdir="." />  
</target> 

Als ich zum ersten Mal auf diese sah Ich dachte, es wäre ein einfacher Fall, StyleCop auf ähnliche Weise wie Msbuild auszuführen.

Allerdings kommt StyleCop als eine Reihe von DLLs ...

Dies bedeutet also, kann ich nicht tun, was ich wollte ...... Ich denke ....

die Artikel Alles, was ich habe googled heute gesagt "benutze StyleCopCmd" was ich auch nicht machen kann wegen der 3rd party tool restriction.

Ich habe mir das Tool angesehen und es scheint, eine benutzerdefinierte nant Aufgabe zu implementieren, die die StyleCopConsole startet, in ein paar Ereignisse einhakt und einen schön formatierten Bericht ausgibt. Aber um die Erstellung eines beliebigen Werkzeugs im eigenen Haus rechtfertigen zu können, muss ich in der Lage sein, vollständig zu erklären, warum ich in der nan-Konfigurationsdatei nicht nur das erreichen kann, was ich möchte. Oder auf eine andere Weise, die kein Erstellen oder Verwenden eines Werkzeugs beinhaltet. Und im Idealfall wäre es schneller, wenn ich sowieso kein Werkzeug schreiben oder benutzen müsste.

Also meine Frage ist, ist das möglich?

Antwort

5

Wir haben es geschafft. Gerade gehen Sie folgendermaßen vor:

  • ein Verzeichnis in Ihrem Projekt erstellen und kopieren Sie alle Dateien StyleCop dort (Microsoft.StyleCop.CSharp.dll, Microsoft.StyleCop.Targets, etc.)

  • bearbeiten Microsoft .StyleCop.Targets wie folgt aussehen:

-

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <UsingTask AssemblyFile="Microsoft.StyleCop.dll" TaskName="StyleCopTask" /> 
    <PropertyGroup> 
     <BuildDependsOn>StyleCop</BuildDependsOn> 
     <RebuildDependsOn>StyleCopForceFullAnalysis;StyleCop</RebuildDependsOn> 
    </PropertyGroup> 
    <PropertyGroup Condition="('$(SourceAnalysisForceFullAnalysis)' != '') and ('$(StyleCopForceFullAnalysis)' == '')"> 
     <StyleCopForceFullAnalysis>$(SourceAnalysisForceFullAnalysis)</StyleCopForceFullAnalysis> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopForceFullAnalysis)' == ''"> 
     <StyleCopForceFullAnalysis>false</StyleCopForceFullAnalysis> 
    </PropertyGroup> 
    <PropertyGroup Condition="('$(SourceAnalysisCacheResults)' != '') and ('$(StyleCopCacheResults)' == '')"> 
     <StyleCopCacheResults>$(SourceAnalysisCacheResults)</StyleCopCacheResults> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopCacheResults)' == ''"> 
     <StyleCopCacheResults>true</StyleCopCacheResults> 
    </PropertyGroup> 

    <!-- Define StyleCopTreatErrorsAsWarnings property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisTreatErrorsAsWarnings)' != '') and ('$(StyleCopTreatErrorsAsWarnings)' == '')"> 
     <StyleCopTreatErrorsAsWarnings>$(SourceAnalysisTreatErrorsAsWarnings)</StyleCopTreatErrorsAsWarnings> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopTreatErrorsAsWarnings)' == ''"> 
     <StyleCopTreatErrorsAsWarnings>true</StyleCopTreatErrorsAsWarnings> 
    </PropertyGroup> 

    <PropertyGroup Condition="('$(SourceAnalysisEnabled)' != '') and ('$(StyleCopEnabled)' == '')"> 
     <StyleCopEnabled>$(SourceAnalysisEnabled)</StyleCopEnabled> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopEnabled)' == ''"> 
     <StyleCopEnabled>true</StyleCopEnabled> 
    </PropertyGroup> 

    <!-- Define StyleCopOverrideSettingsFile property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisOverrideSettingsFile)' != '') and ('$(StyleCopOverrideSettingsFile)' == '')"> 
     <StyleCopOverrideSettingsFile>$(SourceAnalysisOverrideSettingsFile)</StyleCopOverrideSettingsFile> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopOverrideSettingsFile)' == ''"> 
     <StyleCopOverrideSettingsFile> </StyleCopOverrideSettingsFile> 
    </PropertyGroup> 

    <!-- Define StyleCopOutputFile property. --> 
    <PropertyGroup Condition="('$(StyleCopOutputPath)' == '')"> 
     <StyleCopOutputPath>$(IntermediateOutputPath)</StyleCopOutputPath> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopOutputFile)' == ''"> 
     <StyleCopOutputFile Condition="!HasTrailingSlash('$(StyleCopOutputPath)')">$(StyleCopOutputPath)\$(AssemblyName).StyleCopViolations.xml</StyleCopOutputFile> 
     <StyleCopOutputFile Condition="HasTrailingSlash('$(StyleCopOutputPath)')">$(StyleCopOutputPath)$(AssemblyName).StyleCopViolations.xml</StyleCopOutputFile> 
    </PropertyGroup> 

    <!-- Define all new properties which do not need to have both StyleCop and SourceAnalysis variations. --> 
    <PropertyGroup> 
     <!-- Specifying 0 will cause StyleCop to use the default violation count limit. 
     Specifying any positive number will cause StyleCop to use that number as the violation count limit. 
     Specifying any negative number will cause StyleCop to allow any number of violations without limit. --> 
     <StyleCopMaxViolationCount Condition="'$(StyleCopMaxViolationCount)' == ''">100</StyleCopMaxViolationCount> 
    </PropertyGroup> 

    <!-- Define target: StyleCopForceFullAnalysis --> 
    <Target Name="StyleCopForceFullAnalysis"> 
     <CreateProperty Value="true"> 
      <Output TaskParameter="Value" PropertyName="StyleCopForceFullAnalysis" /> 
     </CreateProperty> 
    </Target> 

    <!-- Define target: StyleCop --> 
    <Target Name="StyleCop" Condition="'$(StyleCopEnabled)' != 'false'"> 
     <!-- Determine what files should be checked. Take all Compile items, but exclude those that have set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. --> 
     <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' != 'true') and ('%(Compile.ExcludeFromSourceAnalysis)' != 'true')"> 
      <Output TaskParameter="Include" ItemName="StyleCopFiles"/> 
     </CreateItem> 

     <Message Text="Forcing full StyleCop reanalysis." Condition="'$(StyleCopForceFullAnalysis)' == 'true'" Importance="Low" /> 

     <Message Text="Analyzing @(StyleCopFiles)" Importance="Low" /> 

     <!-- Run the StyleCop MSBuild task. --> 
     <StyleCopTask 
      ProjectFullPath="$(MSBuildProjectFile)" 
      SourceFiles="@(StyleCopFiles)" 
      AdditionalAddinPaths="@(StyleCopAdditionalAddinPaths)" 
      ForceFullAnalysis="$(StyleCopForceFullAnalysis)" 
      DefineConstants="$(DefineConstants)" 
      TreatErrorsAsWarnings="$(StyleCopTreatErrorsAsWarnings)" 
      CacheResults="$(StyleCopCacheResults)" 
      OverrideSettingsFile="$(StyleCopOverrideSettingsFile)" 
      OutputFile="$(StyleCopOutputFile)" 
      MaxViolationCount="$(StyleCopMaxViolationCount)" 
      /> 

     <!-- Make output files cleanable --> 
     <CreateItem Include="$(StyleCopOutputFile)"> 
      <Output TaskParameter="Include" ItemName="FileWrites"/> 
     </CreateItem> 

     <!-- Add the StyleCop.cache file to the list of files we've written - so they can be cleaned up on a Build Clean. --> 
     <CreateItem Include="StyleCop.Cache" Condition="'$(StyleCopCacheResults)' == 'true'"> 
      <Output TaskParameter="Include" ItemName="FileWrites"/> 
     </CreateItem> 
    </Target> 
</Project> 
  • Fügen Sie dem NAnt-Skript, in dem Sie StyleCop ausführen möchten, die folgenden Aufgaben hinzu. Ersetzen Sie einfach die NAnt-Eigenschaften durch die Eigenschaften oder Werte, die für Ihr Build-Skript sinnvoll sind.

    <msbuild project="${solutionfile}" target="ReBuild" verbosity="Quiet"> 
         <property name="CustomAfterMicrosoftCommonTargets" value="${path::combine(project:get-base-directory(), relative-path-to-Microsoft.StyleCop.Targets)}"/> 
         <property name="Configuration" value="Release"/> 
         <property name="StyleCopEnabled" value="true" /> 
         <property name="StyleCopOutputPath" value="${directory-to-dump-output-report-to}" /> 
         <arg value="/noconsolelogger" /> 
        </msbuild> 
    
+0

Hallo Trumpi - ich durch sie jetzt werde und es auszuprobieren - eine Frage - nicht „target =“ Rebuild „“ gleich bleiben oder wird das jetzt zu meinem ursprünglichen Build-Ziel verweisen (gezeigt in mein Post)? –

+0

auch der Pfad zu der modifizierten Microsoft.StyleCop.Targets-Datei - ist das relativ von der Build-Datei oder der Lösungsdatei? –

+0

hmm googlen und denke, dass es in meine ursprüngliche Aufgabe gehen muss, dh den exec Aufruf replcae - versuchen, dass jetzt ... –