2009-08-18 13 views
5

me ha pedido para integrar StyleCop en nuestro proceso de construcción de CI de una manera tal que:integración StyleCop a los procesos CI acumulación (Control Criuse, Nant, msbuild y StyleCop)

  • archivo de proyecto individual en nuestra (solución grande) no se ven afectados
  • que no tienen que utilizar cualquier tercera parte herramienta

el primer requisito (y no comprender plenamente esto todavía) se debe al hecho de que nosotros no' Quiero ejecutar StyleCop en todo nuestro solución directamente. Aparentemente, cuando se ejecuta StyleCop desde VS, ignora ciertos atributos que especifican archivos para ignorar. Debido a esto, si lo tenemos funcionando en las máquinas de desarrollo, continuamente nos veremos afectados por miles de violaciones que aún no estamos listos para enfrentar. El resultado final es que queremos poder ejecutarlo solo en el servidor de compilación.

Nuestro entorno de construcción se compone actualmente de:

Control de crucero> tarea Nant que ejecuta msbuild (a través de exec)

La tarea nante es el siguiente:

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

Cuando vi por primera vez en este Pensé que sería un simple caso de ejecutar StyleCop de manera similar a la forma en que se ejecuta msbuild.

Sin embargo, StyleCop se presenta como un conjunto de archivos DLL ...

Así que esto significa que no puedo hacer lo que me proponía ...... creo ....

Todos los artículos que he Google hoy ha dicho "use StyleCopCmd", que tampoco puedo hacer debido a la restricción de la herramienta de terceros.

He mirado la herramienta y parece implementar una tarea personalizada que inicia la StyleCopConsole, se engancha en un par de eventos y genera un informe muy bien formateado. Pero para poder justificar la creación de cualquier herramienta internamente, debo ser capaz de explicar completamente por qué no puedo lograr lo que quiero en el archivo de configuración nant. O de cualquier otra manera que no implique crear o usar una herramienta. E idealmente, sería más rápido si no tuviera que escribir o usar una herramienta de todos modos.

Entonces mi pregunta es, ¿es eso posible?

Respuesta

5

Hemos logrado hacer esto. Sólo tienes que seguir estos pasos:

  • Crear un directorio en su proyecto y copiar todos los archivos que hay StyleCop (Microsoft.StyleCop.CSharp.dll, Microsoft.StyleCop.Targets, etc.)

  • editar archivos de Microsoft .StyleCop.Targets a este aspecto:

-

<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> 
  • Agregue las siguientes tareas a su script NAnt donde desea ejecutar StyleCop. Simplemente reemplace las propiedades NAnt con las propiedades o valores que tengan sentido para su script de compilación.

    <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

Hola Trumpi - Voy a través de él ahora y tratar a cabo - una pregunta - no "target =" Reconstruir "" siguen siendo los mismos, o se que apuntan ahora a mi destino de generación originales (que se muestra en mi publicacion)? –

+0

también, la ruta al archivo Microsoft.StyleCop.Targets modificado: ¿es esto relativo del archivo de compilación o del archivo de solución? –

+0

hmm he estado buscando en Google y creo que es necesario ir dentro de mi tarea original, es decir, volver a ejecutar la llamada del ejecutivo, intentando que ahora ... –