なか日記

一度きりの人生、楽しく生きよう。

StyleCopを使ってみる

先日オープンソースになったStyleCop*1をインストールして少し使ってみましたので、メモっておきます。

環境はMicrosoft Visual C# 2010 Expressです。
2008もしくは2010のProfessional以上ならVisual Studioに統合することも可能です。

ダウンロード

安定版は4.3.3ということですが、Visual Studio 2010に正式に対応しているのは現在ベータ版の4.4ということなので、4.4を使うことにします。
4.3.3を使うと、「ToolsVersionの4.0*2なんて知らないよ。3.5*3と見なしてチェックするよ。」みたいなメッセージが表示されます。

バージョン4.4.0.9


StyleCop

StyleCopのインストール

Microsoft.StyleCop.msi をダブルクリックしてインストーラを起動します。

基本的に、インストーラに従って「Next」ボタンを押すだけですが、「Custom Setup」の画面で、「MSBuild integration files」にチェックを入れるのだけ注意が必要です。

Expressのみインストールされている場合

f:id:nakaji999:20100508001843j:image

Professional以上がインストールされている場合

以下の様にVisual Studioとの連携に関する項目が表示されます。
f:id:nakaji999:20100508002751j:image

StyleCopにチェックさせるための設定

プロジェクトファイル(*.csproj)を開き、StyleCopの設定をインポートするようにします。

編集後

2行目を追加します。

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.targets" />

※4.3を使用する場合は「v4.4」の箇所を「v4.3」に変更します

チェックしてもらおう

設定が終わればビルドするだけです。

サンプルソース
using System;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
        private int _hoge;
        
        public void Fuga()
        {
        }
    }
}

これをビルドすると…

ビルド結果
------ ビルド開始: プロジェクト: ClassLibrary1, 構成: Release Any CPU ------
D:\Data\VS2010Projects\ClassLibrary1\Class1.cs(9,21): 警告 CS0169: フィールド 'ClassLibrary1.Class1._hoge' は使用されませんでした。

コンパイルの完了 -- エラー 0、警告 1
  ClassLibrary1 -> D:\Data\VS2010Projects\ClassLibrary1\bin\Release\ClassLibrary1.dll
Properties\AssemblyInfo.cs(1,1): warning : SA1633: The file has no header, the header Xml is invalid, or the header is not located at the top of the file.
Class1.cs(7,1): warning : SA1600: The class must have a documentation header.
Class1.cs(9,1): warning : SA1600: The field must have a documentation header.
Class1.cs(11,1): warning : SA1600: The method must have a documentation header.
Class1.cs(1,1): warning : SA1633: The file has no header, the header Xml is invalid, or the header is not located at the top of the file.
Class1.cs(9,1): warning : SA1309: Field names must not start with an underscore.
Class1.cs(1,1): warning : SA1200: All using directives must be placed inside of the namespace.
Class1.cs(2,1): warning : SA1200: All using directives must be placed inside of the namespace.
Class1.cs(3,1): warning : SA1200: All using directives must be placed inside of the namespace.
========== ビルド: 正常終了または最新の状態 1、失敗 0、スキップ 0 ==========

英文を見れば言わんとしていることはだいたい分かりますが、詳細は下記ヘルプに載っています。
C:\Program Files\MSBuild\Microsoft\StyleCop\v4.4\Docs\StyleCop.chm

不要なチェックを外す

チェックの内容が気に入らない場合には、特定ルールだけチェックさせないようにもできます。

C:\Program Files\MSBuild\Microsoft\StyleCop\v4.4 配下にある StyleCopSettingsEditor.exe でカスタマイズができます。
同フォルダにある Settings.StyleCop をダブルクリックします。*4
f:id:nakaji999:20100508002752j:image

あとは、無視したいルールのチェックを外してしまうだけですね。

特定のクラスだけルールを無視する

以下のように記述すれば、特定のクラスだけルールを無視するようにもできます。

SA1600に関するルールを無視する例
namespace ClassLibrary1
{
    using System;
    using System.Diagnostics.CodeAnalysis;
    using System.Linq;
    using System.Text;

    [SuppressMessage("Microsoft.StyleCop.CSharp.DocumentationRules", "SA1600:ElementsMustBeDocumented")]
    public class Class1
    {
        private int _hoge;
        
        public void Fuga()
        {
        }
    }
}

このあたりのことも StyleCop.chm に少し載ってます。

特定のファイルをチェック対象から外す

特定のファイルのみチェックさせないようにすることも出来ます。
プロジェクトファイル(*.csproj)のCompileで指定されている該当のファイルを以下の様に変更します。

変更前
  <ItemGroup>
    <Compile Include="Class1.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
変更後
  <ItemGroup>
    <Compile Include="Class1.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" >
      <ExcludeFromStyleCop>true</ExcludeFromStyleCop>
    </Compile>
  </ItemGroup>

最後に

SytleCopに関するブログ


MSDN Blogs

所感
  • コーディング規約のチェックを自動化できるので、チーム開発の時には便利(当たり前
  • 個人的にチェックさせる成果物がないのに後で気がついたorz…

*1:静的解析ツール

*2:Visual Studio 2010

*3:Visual Studio 2008 SP1?

*4:もしくは、 StyleCopSettingsEditor.exe にD&Dする