2012-02-14 6 views
9

포럼과 인터넷에서 일반적으로 검색하는 일을 빨리 처리 할 수있는 빠른 프리 커서가이 포럼과 다른 곳에서 발견 된 많은 제안을 시도해 보았습니다.StyleCop 구현 MSBUILD NuGet 패키지

내가 겪고있는 문제는 내 회사가 StyleCop, ReSharper 및 JSLint (등)와 같은 도구를 사용하여 내부 자동화 된 동료 검토 (물론 범위까지)를 구현하려고한다는 것입니다.

우리는 내부 NuGet 패키지 저장소 (피드)에 대한 사용자 정의 NuGet 패키지를 사용하여 개발자가 관리 릴리스 도구를 얻을 수 있습니다 (예 : 최신 StyleCop이 검토되고 릴리스 될 때까지 다운로드 할 수 없음) 맞춤 규칙 (StyleCop 설정 파일)이 추가되었습니다. 빌드시 오류를 강조 표시하기 위해 StyleCop MSBUILD 작업을 사용하고자하므로 StyleCop 어셈블리가 정확해야하므로 NuGet 릴리스를 위해 C : \ Program Files \ version 설치를 배제하고 있습니다.

프로젝트 (클래스 라이브러리, 웹 사이트 등)에 설치하는 NuGet 패키지를 생성하고 승인 된 StyleCop 어셈블리 (StyleCop.dll, StyleCop.CSharp.dll 및 StyleCop.CSharpRules.dll)를 복사하고, 내가 StyleCop 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> 

: : Settings.StyleCop 패키지 폴더에 StyleCop.Targets, 그리고 다음 노드 (물론이 스 니펫)를 포함하도록 .csproj 파일을 수정 \ 프로그램 Files \ 및 C : \ Program Files \ MSBUILD에 있으면 모든 것이 작동하지만이 메서드를 사용하면 StyleCop.Targets가 올바르게 작동하지 않는 것 같습니다. 파일을 제거하고 StyleCop.Cache 파일을 만들면 Visual Studio 2010에서 오류가 발생하므로이 파일이 사용됩니다. StyleCop.Targets 파일이 NuGet 패키지 폴더의 로컬 DLL을 가리 키도록 변경되었으며, 상대적인 파일 경로 변경이있는 표준 StyleCop 하나를 포함하여 몇 가지 다른 .Targets 파일을 시도했습니다. 로컬로 MSBUILD 속성을 재정의하더라도 OverrideSettingsFile과 같이 작동하지 않습니다.

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

사람이 내가이 작업을 얻을 수있는 방법을 알고 있나요

:

StyleCop.Targets 파일은 현재 다음과 같습니다? Visual Studio 2010은 출력 창에 메시지를 표시하지 않습니다.

건배!

+4

FYI 방금 lib 참조가 아닌 빌드 스크립트와 함께 사용하기 위해 StyleCop.MSBuild NuGet 패키지를 게시했습니다. https://nuget.org/packages/StyleCop.MSBuild –

답변

7

나는 유사한 위치에있는 누군가를 위해 나온 해결책을 게시하고 있습니다./내에 있던 StyleCopViolations.xml을 확인

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

이 다음은

는 첫째로 나는 나를 논리와 변수의 일부를 철하는 데 도움이 디버깅은 MSBuild 작업에이 훌륭한 가이드를 따라 obj/Debug/폴더. 나는이에 대한 몇 가지 연구를

<StyleCopViolations/> 

와 나는 내 NuGet/lib 디렉토리/net40/폴더에 StyleCop.CSharpRules.dll을 포함 할 필요가 있다고 발견이 그러나 언제나 다음과 같은 XML을, 0 결과를 반환 StyleCop.dll, StyleCop.CSharp.dll 및 StyleCop.Settings 파일.

내 프로젝트에서 앞에서 언급 한 어셈블리에 대한 참조가 필요하지 않지만 NuGet 패키지에 StyleCop.CSharpRules.dll이 포함되지 않은 NuGet 패키지에 대한 종속성이 있음을 알았습니다.

이 어셈블리를 추가 한 후에도 여전히 결과가 0으로 표시되었으므로 CodeCall의 C : \ Program Files \ StyleCop \ Installer (StyleCop C : \ Program Files \ StyleCop \ installer)를 새로 설치하면 모든 어셈블리와 .Settings 파일을 수동으로 덮어 썼습니다. . NuGet 패키지 어셈블리를 덮어 쓴 후이 작업이 시작되었습니다!

마무리하려면 MSBuild (이 게시물 상단의 링크 포함)를 디버깅하고 NuGet 패키지를 사용하지 마십시오!

건배

+1

아아 ... 해결책 주셔서 감사합니다! 나 자신의 시나리오를 만들기 위해'NuGet' 패키지 "StyleCop'"에서'StyleCop'을 사용하려했지만 아무것도하지 않았습니다. 문제는'StyleCop.CSharpRules.dll' 누락입니다. 그런 다음''StyleCop.MShuild''''NuGet' 패키지로 전환했습니다. 여기에는'StyleCop.CSharpRules.dll'이 들어 있습니다. 이제는 모든 것이 잘 작동합니다! –

2

드미트리 로바 노프에 의해 제안 사용 StyleCop.MSBuild 대신 StyleCop.

즉 패키지 관리자 콘솔에서 install-package stylecop.msbuild 명령을 사용하십시오.

0

당신은 및 StyleCop.Error.MSBuild오류로 stylecop 경고를 활성화 nuget 패키지의 조합 StyleCop.MSBuild를 사용할 수 있습니다.

관련 문제