2012-02-14 37 views
9

Một tiền thân nhanh để nói rằng tôi đã thực hiện tìm kiếm thông thường trên các diễn đàn và mạng nói chung, và tôi đã thử vô số đề xuất tìm thấy trên diễn đàn này và ở nơi khác không có kết quả.Thực hiện StyleCop MSBUILD từ Gói NuGet

Vấn đề tôi gặp phải là công ty của tôi đang tìm cách triển khai các đánh giá ngang hàng tự động nội bộ (với mức độ tất nhiên) với việc sử dụng các công cụ như StyleCop, ReSharper và JSLint (v.v.).

Chúng tôi đang sử dụng gói NuGet tùy chỉnh với Gói lưu trữ gói NuGet (feed) nội bộ của chúng tôi để các nhà phát triển của chúng tôi có được bản phát hành công cụ (nghĩa là họ không thể tải xuống StyleCop mới nhất cho đến khi được xem xét và phát hành) với việc bổ sung các quy tắc tùy chỉnh của chúng tôi (tệp Cài đặt StyleCop). Bởi vì chúng ta muốn sử dụng các nhiệm vụ của StyleCop MSBUILD để làm nổi bật các lỗi tại thời gian xây dựng, các assembly cho StyleCop cần phải chính xác và do đó chúng ta đang loại bỏ các bản cài đặt của C: \ Program Files \ phiên bản có lợi cho bản phát hành NuGet.

Tôi đã quản lý để tạo gói NuGet cài đặt cho dự án (thư viện lớp, trang web, v.v.), sao chép các hội đồng StyleCop được phê duyệt (StyleCop.dll, StyleCop.CSharp.dll và StyleCop.CSharpRules.dll) , Settings.StyleCop và StyleCop.Targets vào thư mục gói, và sửa đổi các file csproj để bao gồm các nút sau (đây chỉ là một đoạn của khóa học):

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

Nếu tôi đã StyleCop cài đặt như C: \ Program Files \ và trong C: \ Program Files \ MSBUILD thì mọi thứ hoạt động, nhưng sử dụng phương thức này thì StyleCop.Targets dường như không hoạt động chính xác. Nó đang được sử dụng như Visual Studio 2010 ném lỗi nếu tập tin được loại bỏ và nó tạo ra một tập tin StyleCop.Cache. Tệp StyleCop.Targets đã được thay đổi để trỏ vào tệp DLL cục bộ trong thư mục gói NuGet và tôi đã thử một vài tệp .Targets khác nhau bao gồm tệp StyleCop tiêu chuẩn (với các thay đổi về tệp tương đối). Ngay cả khi tôi ghi đè lên các thuộc tính MSBUILD cục bộ, nó không hoạt động, chẳng hạn như OverrideSettingsFile.

Các StyleCop.Targets tập tin trông giống như hiện nay:

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

Có ai biết làm thế nào tôi có thể làm việc này? Visual Studio 2010 không hiển thị bất kỳ thư nào trong cửa sổ Output.

Chúc mừng tất cả!

+4

FYI Tôi vừa mới phát hành gói StyleCop.MSBuild NuGet để sử dụng với các tập lệnh xây dựng, chứ không phải là tham chiếu lib. Xem https://nuget.org/packages/StyleCop.MSBuild –

Trả lời

7

Tôi đang đăng giải pháp mà tôi đã gặp cho bất kỳ ai ở một vị trí tương tự.

Trước hết tôi theo hướng dẫn tuyệt vời này vào gỡ lỗi hoạt động MSBuild, mà đã giúp tôi để sắt ra một số logic và các biến:

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

Sau này tôi đã kiểm tra các StyleCopViolations.xml đó là trong tôi/obj/Gỡ lỗi/thư mục. Tuy nhiên điều này luôn được trả về 0 kết quả, chỉ với XML sau:

<StyleCopViolations/> 

tôi đã làm một số nghiên cứu về vấn đề này và thấy rằng tôi cần phải bao gồm StyleCop.CSharpRules.dll để NuGet tôi/lib/net40/thư mục với Các tệp StyleCop.dll, StyleCop.CSharp.dll và StyleCop.Settings.

Dự án của tôi không cần tham chiếu đến bất kỳ hội đồng nào nói trên, nhưng tôi nhận ra rằng gói NuGet của tôi có sự phụ thuộc vào gói StyleCop NuGet không bao gồm StyleCop.CSharpRules.dll.Sau khi thêm assembly này, tôi vẫn thấy kết quả 0, vì vậy tôi đã ghi đè lên tất cả 3 assembly và file .Settings từ một cài đặt mới của StyleCop C: \ Program Files \ StyleCop \ installer (từ CodePlex). . Sau khi ghi đè lên, gói NuGet bắt đầu hoạt động!

Vì vậy, để kết thúc, gỡ lỗi MSBuild của bạn (với liên kết ở đầu bài đăng này) và không sử dụng gói NuGet ngay!

Cheers

+1

Argh ... cảm ơn vì giải pháp! Tôi đã cố gắng sử dụng 'StyleCop' từ gói' NuGet' "' StyleCop' "để xây dựng kịch bản của riêng tôi, nhưng nó không làm gì cả. Vấn đề là thiếu 'StyleCop.CSharpRules.dll'. Sau đó, tôi chuyển sang gói "' StyleCop.MSBuild' "' NuGet', chứa 'StyleCop.CSharpRules.dll', và bây giờ mọi thứ hoạt động tốt! –

2

Sử dụng StyleCop.MSBuild thay vì StyleCop theo đề nghị của Dmitry Lobanov.

tức là sử dụng lệnh install-package stylecop.msbuild trong bảng điều khiển trình quản lý gói.

0

Bạn có thể sử dụng kết hợp các gói NuGet StyleCop.MSBuildStyleCop.Error.MSBuild để cho phép cảnh báo StyleCop như lỗi.

Các vấn đề liên quan