2012-02-14 14 views
9

Un precursor rápido para decir que he hecho la búsqueda habitual en los foros y la red en general, y he intentado una gran cantidad de sugerencias encontradas en este foro y en otros sitios sin resultado.Implementando StyleCop MSBUILD del paquete NuGet

El problema que tengo es que mi empresa está buscando implementar revisiones automáticas internas (hasta cierto punto por supuesto) con el uso de herramientas como StyleCop, ReSharper y JSLint (etc, etc.).

Estamos usando un paquete NuGet personalizado contra nuestro NuGet Package Repository (feed) para que nuestros desarrolladores obtengan una versión administrada de herramientas (es decir, no pueden descargar la última versión de StyleCop hasta que sea revisada y publicada) con la adición de nuestras reglas personalizadas (archivo de configuración de StyleCop). Como queremos utilizar las tareas de StyleCop MSBUILD para resaltar los errores en tiempo de compilación, los ensamblados de StyleCop deben ser exactos y, por lo tanto, descartamos la instalación de la versión C: \ Program Files \ a favor de una versión de NuGet.

He logrado crear un paquete NuGet que se instala en un proyecto (biblioteca de clases, sitio web, etc.), copia los ensamblados aprobados de StyleCop (StyleCop.dll, StyleCop.CSharp.dll y StyleCop.CSharpRules.dll) , Settings.StyleCop y StyleCop.Targets a la carpeta del paquete, y modifica el archivo .csproj incluir los siguientes nodos (este sólo un fragmento, por supuesto):

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup Condition=" '$(Configuration)' != 'Debug' "> 
     <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings> 
    </PropertyGroup> 

    <Import Project="$(SolutionDir)\packages\NuGetPackageName.1.0.0\StyleCop.Targets" /> 
</Project> 

Si tengo instalada StyleCop como C: \ Program Files \ y en C: \ Program Files \ MSBUILD todo funciona, pero con este método, StyleCop.Targets no parece funcionar correctamente. Se está utilizando como Visual Studio 2010 arroja errores si el archivo se elimina y crea un archivo StyleCop.Cache. El archivo StyleCop.Targets se ha cambiado para que apunte a la DLL local en la carpeta del paquete NuGet, y he intentado con un par de archivos .Targets diferentes, incluido el estándar StyleCop (con los relativos cambios de ruta de archivo). Incluso si anulo las propiedades MSBUILD localmente, no funciona, como OverrideSettingsFile.

El archivo StyleCop.Targets se parece a esto actualmente:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- Specify where tasks are implemented. --> 
    <UsingTask AssemblyFile="$(SolutionDir)\packages\NuGetPackageName.1.0.0\lib\net40\StyleCop.dll" TaskName="StyleCopTask"/> 

    <PropertyGroup> 
     <BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn> 
     <RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn> 
    </PropertyGroup> 

    <!-- Define StyleCopForceFullAnalysis property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisForceFullAnalysis)' != '') and ('$(StyleCopForceFullAnalysis)' == '')"> 
     <StyleCopForceFullAnalysis>$(SourceAnalysisForceFullAnalysis)</StyleCopForceFullAnalysis> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopForceFullAnalysis)' == ''"> 
     <StyleCopForceFullAnalysis>false</StyleCopForceFullAnalysis> 
    </PropertyGroup> 

    <!-- Define StyleCopCacheResults property. --> 
    <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> 

    <!-- Define StyleCopEnabled property. --> 
    <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="('$(SourceAnalysisOutputFile)' != '') and ('$(StyleCopOutputFile)' == '')"> 
     <StyleCopOutputFile>$(SourceAnalysisOutputFile)</StyleCopOutputFile> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopOutputFile)' == ''"> 
     <StyleCopOutputFile>$(IntermediateOutputPath)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)' == ''">0</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'"> 
     <Message Text="Forcing full StyleCop reanalysis." Condition="'$(StyleCopForceFullAnalysis)' == 'true'" Importance="Low" /> 

     <!-- 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="Analyzing @(StyleCopFiles)" Importance="Low" /> 

     <!-- Show list of what files should be excluded. checked. Take all Compile items, but exclude those that have set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. --> 
     <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' == 'true') or ('%(Compile.ExcludeFromSourceAnalysis)' == 'true')"> 
      <Output TaskParameter="Include" ItemName="StyleCopExcludedFiles"/> 
     </CreateItem> 

     <ItemGroup> 
      <StyleCopFiles Remove="@(ExcludeFromStyleCop)" /> 
     </ItemGroup> 

     <Message Text="Excluding @(StyleCopExcludedFiles)" Importance="Normal" /> 

     <!-- Run the StyleCop MSBuild task. --> 
     <StyleCopTask ProjectFullPath="$(MSBuildProjectDirectory)" 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> 

¿Alguien sabe cómo puedo conseguir este trabajo? Visual Studio 2010 no muestra ningún mensaje en la ventana de resultados.

¡Saludes a todos!

+4

FYI Acabo de publicar el paquete StyleCop.MSBuild NuGet para su uso con scripts de construcción, en lugar de como referencia de lib. Ver https://nuget.org/packages/StyleCop.MSBuild –

Respuesta

7

Estoy publicando la solución que encontré para cualquier persona en una posición similar.

En primer lugar he seguido este excelente guía en la depuración de las operaciones de MSBuild, que me ayudó a limar algunos de la lógica y las variables:

http://blogs.msdn.com/b/visualstudio/archive/2010/07/06/debugging-msbuild-script-with-visual-studio.aspx

Después de esto he comprobado la StyleCopViolations.xml que estaba en mi/Obj/Debug/carpeta. Sin embargo, esto siempre ha devuelto 0 resultados, con sólo el siguiente código XML:

<StyleCopViolations/> 

hice algunas investigaciones sobre este y se encontró que tenía que incluir en StyleCop.CSharpRules.dll a mi NuGet// net40/lib con el StyleCop.dll, StyleCop.CSharp.dll y StyleCop.Settings archivos.

Mi proyecto no necesitaba referencias a ninguno de los ensamblados antes mencionados, pero me di cuenta de que mi paquete NuGet tenía una dependencia en el paquete StyleCop NuGet que no incluía StyleCop.CSharpRules.dll.

Después de agregar este ensamblaje todavía estaba viendo 0 resultados, así que hice una anulación manual de los 3 ensamblajes y el archivo .Settings de una nueva instalación de StyleCop C: \ Program Files \ StyleCop \ installer (desde CodePlex) . Después de sobrescribir los ensamblajes del paquete NuGet ¡esto comenzó a funcionar!

Para terminar, depure su MSBuild (con el enlace en la parte superior de esta publicación) y no use el paquete NuGet todavía.

Saludos

+1

Argh ... ¡gracias por la solución! Intenté usar 'StyleCop' del paquete' NuGet' '' StyleCop' "para construir mi propio escenario, pero no hizo nada. El problema era que faltaba 'StyleCop.CSharpRules.dll'. Luego cambié al paquete '' StyleCop.MSBuild' '' NuGet', que contiene 'StyleCop.CSharpRules.dll', ¡y ahora todo funciona bien! –

2

Use StyleCop.MSBuild en lugar de StyleCop como sugiere Dmitry Lobanov.

es decir, use el comando install-package stylecop.msbuild en la consola del gestor de paquetes.

0

Se puede utilizar combinación de paquetes NuGet StyleCop.MSBuild y StyleCop.Error.MSBuild para habilitar advertencias StyleCop como errores.

Cuestiones relacionadas