2009-08-18 16 views
5

tôi đã được yêu cầu để tích hợp StyleCop trong quá trình xây dựng CI của chúng tôi theo cách như vậy mà:StyleCop tích hợp với CI quá trình xây dựng (Criuse Control, Nant, msbuild và StyleCop)

  • tập tin dự án cá nhân trong chúng ta (lớn) giải pháp không bị ảnh hưởng
  • tôi không cần phải sử dụng bất kỳ bên thứ 3 cụ

yêu cầu đầu tiên (và tôi không hiểu đầy đủ này chưa) là do thực tế rằng chúng tôi không' Tôi muốn chạy StyleCop trên toàn bộ giải pháp ngay lập tức. Rõ ràng, khi StyleCop được chạy từ bên trong VS nó bỏ qua một số thuộc tính xác định các tệp cần bỏ qua. Bởi vì điều này, nếu chúng ta có nó chạy trên các máy dev, chúng tôi sẽ liên tục bị tấn công bởi hàng ngàn vi phạm mà chúng ta chưa sẵn sàng giải quyết. Vì vậy, dòng dưới cùng là chúng tôi muốn để có thể chạy nó chỉ trên máy chủ xây dựng.

môi trường xây dựng của chúng tôi hiện nay bao gồm:

kiểm soát Cruise> nhiệm vụ Nant thực thi msbuild (thông qua exec)

Nhiệm vụ Nant là dưới đây:

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

Khi lần đầu tiên tôi nhìn này Tôi nghĩ rằng nó sẽ là một trường hợp đơn giản của việc thực hiện StyleCop một cách tương tự như cách msbuild đang được thực hiện.

Tuy nhiên, StyleCop đến như là một tập hợp các dlls ...

Vì vậy, đây có nghĩa là tôi không thể làm những gì tôi dự định ...... Tôi nghĩ ....

Tất cả các bài viết tôi có googled ngày hôm nay đã nói "sử dụng StyleCopCmd" mà tôi cũng không thể làm vì hạn chế công cụ của bên thứ 3.

Tôi đã xem công cụ và dường như thực hiện tác vụ nant tùy chỉnh khởi động StyleCopConsole, móc vào một vài sự kiện và xuất ra báo cáo được định dạng độc đáo. Nhưng để có thể biện minh cho việc tạo ra bất kỳ công cụ nào trong nhà, tôi cần có khả năng giải thích đầy đủ lý do tại sao tôi không thể đạt được những gì tôi muốn trong tệp cấu hình nant. Hoặc theo bất kỳ cách nào khác không liên quan đến việc tạo hoặc sử dụng công cụ. Và lý tưởng, nó sẽ nhanh hơn nếu tôi không phải viết hoặc sử dụng một công cụ nào.

Vì vậy, câu hỏi của tôi là, có khả thi không?

Trả lời

5

Chúng tôi đã quản lý để thực hiện việc này. Chỉ cần làm theo các bước sau:

  • Tạo một thư mục trong dự án của bạn và sao chép tất cả các file StyleCop đó (Microsoft.StyleCop.CSharp.dll, Microsoft.StyleCop.Targets, vv)

  • Sửa Microsoft .StyleCop.Targets trông như thế này:

-

<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> 
  • Thêm các tác vụ sau vào tập lệnh NAnt của bạn nơi bạn muốn chạy StyleCop. Chỉ cần thay thế các thuộc tính NAnt bằng các thuộc tính hoặc các giá trị có ý nghĩa cho kịch bản xây dựng của bạ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

Hi Trumpi - Tôi sẽ qua nó bây giờ và cố gắng nó ra - một câu hỏi - không "target =" Rebuild "" vẫn như cũ hoặc sẽ mà bây giờ trỏ đến gốc xây dựng mục tiêu của tôi (hiển thị trong bài viết của tôi)? –

+0

cũng có, đường dẫn đến tệp Microsoft.StyleCop.Targets đã sửa đổi - có liên quan đến tệp xây dựng hoặc tệp giải pháp này không? –

+0

hmm được googling và nghĩ rằng nó cần phải đi bên trong nhiệm vụ ban đầu của tôi tức là replcae gọi exec - cố gắng mà bây giờ ... –