先日オープンソースになった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
バージョン4.3.3
StyleCopのインストール
Microsoft.StyleCop.msi をダブルクリックしてインストーラを起動します。
基本的に、インストーラに従って「Next」ボタンを押すだけですが、「Custom Setup」の画面で、「MSBuild integration files」にチェックを入れるのだけ注意が必要です。
Professional以上がインストールされている場合
以下の様にVisual Studioとの連携に関する項目が表示されます。
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
あとは、無視したいルールのチェックを外してしまうだけですね。
特定のクラスだけルールを無視する
以下のように記述すれば、特定のクラスだけルールを無視するようにもできます。
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に関するブログ
所感
- コーディング規約のチェックを自動化できるので、チーム開発の時には便利(当たり前
- 個人的にチェックさせる成果物がないのに後で気がついたorz…
*1:静的解析ツール
*2:Visual Studio 2010
*3:Visual Studio 2008 SP1?
*4:もしくは、 StyleCopSettingsEditor.exe にD&Dする