2012-02-14 31 views
9

一個快速的前兆,說我已經完成了圍繞論壇和網絡的通常搜索,並且我已經嘗試了在這個論壇和其他地方找到的許多建議無濟於事。從NuGet包實現StyleCop MSBUILDE

我遇到的問題是我的公司正在尋求使用StyleCop,ReSharper和JSLint等工具來實現內部自動同儕評論(當然程度)。

我們對我們內部的NuGet Package Repository(feed)使用了一個自定義的NuGet包,這樣我們的開發人員就可以獲得一個工具的管理版本(也就是說,他們不能下載最新的StyleCop,直到它被審查併發布)添加了我們的自定義規則(StyleCop設置文件)。因爲我們想在構建時使用StyleCop MSBUILD任務來突出顯示錯誤,所以StyleCop的程序集需要準確無誤,因此我們將排除C:\ Program Files \版本的安裝,以支持NuGet版本。

我已經設法創建一個安裝到項目(類庫,網站等)的NuGet包,複製批准的StyleCop程序集(StyleCop.dll,StyleCop.CSharp.dll和StyleCop.CSharpRules.dll) ,Settings.StyleCop和StyleCop.Targets到包文件夾,並修改的.csproj文件以包括以下節點(這當然只是一個片段):

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

如果我已經安裝了StyleCop爲C:\ PROGRAM Files \和C:\ Program Files \ MSBUILD然後一切正常,但使用此方法StyleCop.Targets似乎不能正常工作。如果文件被刪除並且它創建一個StyleCop.Cache文件,它將被用作Visual Studio 2010引發錯誤。 StyleCop.Targets文件已被更改爲指向NuGet包文件夾中的本地DLL,並且我嘗試了幾個不同的.Targets文件,包括標準StyleCop文件(具有相對的文件路徑更改)。即使我在本地覆蓋MSBUILD屬性,它也不起作用,例如OverrideSettingsFile。

的StyleCop.Targets文件看起來像這樣目前:

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

有誰知道我能得到這個工作? Visual Studio 2010不會在「輸出」窗口中顯示任何消息。

乾杯!

+4

僅供參考我剛纔發佈的StyleCop.MSBuild NuGet包使用與構建腳本,而不是作爲一個lib參考。見https://nuget.org/packages/StyleCop.MSBuild – 2012-03-16 21:15:37

回答

7

我發佈瞭解決方案,我遇到了類似位置的任何人。

首先,我跟着上調試的MSBuild操作這個優秀的指南,幫我燙出一些邏輯和變量:

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

在此之後我檢查了這是在我的StyleCopViolations.xml/obj/Debug /文件夾。然而,這總是返回0的結果,只有下面的XML:

<StyleCopViolations/> 

我做了一些研究,發現這個,我需要包括StyleCop.CSharpRules.dll在我的NuGet/lib目錄/ net40 /與文件夾StyleCop.dll,StyleCop.CSharp.dll和StyleCop.Settings文件。

我的項目並不需要任何上述組件的引用,但我意識到,我的NuGet包了對了StyleCop NuGet包其中不包括StyleCop.CSharpRules.dll的依賴。

加入本次大會,我仍然看到0結果之後,所以我做了所有3個組件和.Settings從一個全新的文件來安裝了StyleCop的C的手動控制裝置:\ Program Files文件\了StyleCop \安裝程序(從CodePlex上) 。覆蓋NuGet軟件包組件後,這開始工作!

所以包,調試的MSBuild(與這篇文章的頂部的鏈接),不要使用NuGet包,只是還沒有!

乾杯

+1

啊...感謝您的解決方案!我試圖從'NuGet'包中使用'StyleCop'''StyleCop''來構建我自己的場景,但它什麼也沒做。問題在於缺少'StyleCop.CSharpRules.dll'。然後我切換到「'StyleCop.MSBuild'」'NuGet'包,其中包含'StyleCop.CSharpRules.dll',現在一切工作正常! – 2012-06-21 08:09:49

2

使用StyleCop.MSBuild,而不是StyleCop由梅德洛巴諾夫建議。

即在包管理器控制檯使用命令install-package stylecop.msbuild

0

可以使用的NuGet包的組合StyleCop.MSBuildStyleCop.Error.MSBuild啓用了StyleCop警告視爲錯誤。