2012-02-14 25 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警告视为错误。