2012-02-14 7 views
9

一般的なフォーラムやネットで一般的な検索を行ったというだけでなく、このフォーラムや他の場所では役に立たない候補が多数試されています。NuGetパッケージからStyleCop MSBUILDを実装する

私が抱えている問題は、私の会社がStyleCop、ReSharper、JSLintなどのツールを使用して内部的な自動ピアレビュー(もちろん)を実装しようとしていることです。

NuGetパッケージリポジトリ(フィード)に対して独自のNuGetパッケージを使用していますので、開発者がツールの管理版を入手できるようになりました(最新のStyleCopがレビューおよびリリースされるまでダウンロードできません)カスタムルール(StyleCop設定ファイル)が追加されました。ビルド時にエラーを強調表示するためにStyleCop MSBUILDタスクを使用したいので、StyleCopのアセンブリが正確である必要があります。そのため、NuGetリリースのためにC:\ Program Files \ versionのインストールを除外しています。

私は、プロジェクト(クラスライブラリ、Webサイトなど)にインストールする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> 

:\ Programに、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

私は同じような立場の誰かのために出会った解決策を投稿しています。

まず、私はロジックと変数の一部を鉄に私を助けている、MSBuildの操作をデバッグする上で、この素晴らしいガイドに従っ:

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

をこれに続いて、私は私の/にあったStyleCopViolations.xmlをチェックしますobj/Debug /フォルダー。私はこの上でいくつかの研究を行った

<StyleCopViolations/> 

と私はと私のNuGet/libに/ net40 /フォルダの中にStyleCop.CSharpRules.dllを含めるために必要なことがわかった。しかし、これは常にだけで、次のXMLで、0の結果を返さStyleCop.dll、StyleCop.CSharp.dllおよびStyleCop.Settingsファイル。

私のプロジェクトでは、上記のアセンブリの参照は必要ありませんでしたが、NuGetパッケージにStyleCop.CSharpRules.dllが含まれていないStyleCop NuGetパッケージに依存していることがわかりました。

このアセンブリを追加した後も、私はまだ0の結果が表示されていましたので、3つのアセンブリすべてと.Settingsファイルを、C:\ Program Files \ StyleCop \ Installer(CodePlexから) 。 NuGetパッケージアセンブリを上書きした後、これが動作し始めました!

最後に、MSBuild(この記事の一番上にあるリンク)をデバッグし、NuGetパッケージをまだ使用しないでください!

乾杯

+1

アー...解決に感謝!私は自分のシナリオを構築するために 'NuGet'パッケージ" StyleCop' "から' StyleCop'を使用しようとしましたが、何もしませんでした。問題は 'StyleCop.CSharpRules.dll'が見つかりませんでした。それから、 '' StyleCop.MSBuild' "' NuGet'パッケージに切り替えました。これには 'StyleCop.CSharpRules.dll'が含まれています。 –

2

ドミトリーLobanovにより示唆されるように使用StyleCop.MSBuildの代わりStyleCop

つまり、パッケージマネージャコンソールでコマンドinstall-package stylecop.msbuildを使用します。

0

あなたはエラーとしてstylecop警告を有効にするためにnugetパッケージの組み合わせStyleCop.MSBuildStyleCop.Error.MSBuildを使用することができます。

関連する問題