2009-08-18 11 views
5

I zostały poproszone zintegrować StyleCop w naszym procesie kompilacji CI w taki sposób, że:integracji StyleCop z CI build procesu (Criuse sterowania, Nant, msbuild i StyleCop)

  • Indywidualny plik projektu w naszym (duża rozwiązanie) nie wpływa
  • nie muszę używać żadnych 3rd party narzędzie

pierwszy warunek (i nie w pełni zrozumieć ten jeszcze) wynika z faktu, że don” t chcesz uruchomić StyleCop na całym naszym rozwiązanie od razu. Najwyraźniej, gdy StyleCop jest uruchamiany z poziomu VS, ignoruje pewne atrybuty, które określają pliki do zignorowania. Z tego powodu, jeśli będziemy go uruchamiać na urządzeniach dla programistów, będziemy ciągle uderzani tysiącami naruszeń, z którymi jeszcze nie jesteśmy gotowi się uporać. Najważniejsze jest więc, aby móc uruchomić go tylko na serwerze kompilacji.

Nasze środowisko budowy składa się obecnie z:

Tempomat> Zadanie NANT który wykonuje msbuild (za pośrednictwem exec)

Zadanie nant poniżej:

<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> 

Kiedy po raz pierwszy spojrzał na to Myślałem, że będzie to prosty przypadek wykonywania StyleCop w sposób podobny do sposobu, w jaki wykonywany jest msbuild.

Jednak StyleCop jest jako zestaw bibliotek DLL ...

Więc to oznacza, że ​​nie może robić to, co zamierzałem ...... myślę ....

Wszystkie artykuły mam Google'owi dzisiaj powiedzieliśmy "użyj StyleCopCmd", którego również nie mogę zrobić z powodu ograniczenia narzędzia strony trzeciej.

Sprawdziłem narzędzie i wygląda na to, że zaimplementowałem niestandardowe zadanie, które uruchamia StyleCopConsole, łączy się w kilka zdarzeń i wysyła ładnie sformatowany raport. Ale aby móc usprawiedliwić stworzenie jakiegokolwiek narzędzia wewnątrz firmy, muszę być w stanie w pełni wyjaśnić, dlaczego nie mogę po prostu osiągnąć tego, czego chcę w nant konfiguracji pliku. Lub w jakikolwiek inny sposób, który nie wymaga tworzenia lub używania narzędzia. A najlepiej byłoby szybciej, gdyby i tak nie musiałem pisać ani używać narzędzia.

Moje pytanie brzmi, czy to możliwe?

Odpowiedz

5

Udało się to zrobić. Wykonaj następujące kroki:

  • Utwórz katalog w projekcie i skopiować wszystkie pliki StyleCop tam (Microsoft.StyleCop.CSharp.dll, Microsoft.StyleCop.Targets, etc.)

  • Edit Microsoft .StyleCop.Targets wyglądać tak:

-

<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> 
  • Dodaj następujące zadania do skryptu NAnt, w którym chcesz uruchomić StyleCop. Wystarczy zastąpić właściwości NAnt właściwościami lub wartościami, które mają sens dla skryptu budowania.

    <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

Hi Trumpi - Idę przez niego teraz i próbuje ją - jedno pytanie - czy „target =” odbudować „” pozostają takie same albo że teraz zwrócić do mojego pierwotnego celu kompilacji (pokazany na mój post)? –

+0

również, ścieżka do zmodyfikowanego pliku Microsoft.StyleCop.Targets - czy jest to względne z pliku kompilacji lub pliku rozwiązania? –

+0

hmm już googlowałem i myślę, że musi wejść w moje pierwotne zadanie, tj. Zastąpić wywołanie exec - próbując tego teraz ... –

Powiązane problemy