2009-08-18 64 views
5

我已经要求了StyleCop在我们的CI构建过程以这样的方式整合了StyleCop集成:在与CI构建过程(Criuse控制,南特,MSBuild的和了StyleCop)

  • 单独的项目文件我们 (大)解决方案不受影响
  • 我没有使用任何第三方 工具

的第一个要求(和我不完全理解这还)是由于我们不”事实我们希望在整个版本上运行StyleCop直接解决方案。显然,当StyleCop从VS中运行时,它会忽略指定要忽略的文件的某些属性。正因为如此,如果我们将它运行在开发机器上,我们将不断遭受数千起我们尚未准备好处理的违规行为。所以底线是我们希望只能在构建服务器上运行它。

我们的构建环境目前包括:

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

当我第一次看到这样的:执行的MSBuild(通过EXEC)

的恶性任务是低于

巡航控制>恶性任务我认为这将是一个简单的例子,以类似于msbuild执行的方式执行StyleCop。

然而,谈到了StyleCop作为一组动态链接库的...

因此,这意味着我不能做什么,我打算......我想....

所有我的文章今天Google搜索到了“使用StyleCopCmd”,我也因为第三方工具限制而无法做到这一点。

我已经看过这个工具,它似乎实现了一个自定义的nant任务,它启动了StyleCopConsole,挂钩到几个事件并输出一个格式良好的报告。但为了能够证明创建任何内部工具,我需要能够充分解释为什么我不能在nant配置文件中实现我想要的。或者以任何其他不涉及创建或使用工具的方式。理想情况下,如果我不必编写或使用工具,速度会更快。

所以我的问题是,这可能吗?

回答

5

我们设法做到了这一点。只要按照下列步骤操作:

  • 在你的项目中创建一个目录,并将所有文件StyleCop的有(Microsoft.StyleCop.CSharp.dll,Microsoft.StyleCop.Targets等)

  • 编辑微软.StyleCop.Targets看起来像这样:

-

<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> 
  • 将以下任务添加到您要运行StyleCop的NAnt脚本。只需将NAnt属性替换为适合构建脚本的属性或值。

    <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

嗨Trumpi - 我现在正在经历它,尝试它 - 一个问题 - 没有“目标=”重建“”保持不变或者将现在指向我原来的构建目标(在所示我的文章)? – 2009-08-19 10:32:01

+0

也是修改后的Microsoft.StyleCop.Targets文件的路径 - 是否与构建文件或解决方案文件相关? – 2009-08-19 10:33:30

+0

嗯一直谷歌搜索,认为它需要进入我原来的任务,即replcae执行调用 - 尝试,现在... – 2009-08-19 10:49:11