[技術] 如何撰寫VSTS 2008的Custom Rule

如何撰寫VSTS 2008的Custom Rule

在專案中,每個人都有自己寫程式的習慣,

若沒有訂出一套統一個Coding Style標準,

可能會讓之後要維護的人非常辛苦。

然而在訂出標準後,如何讓它實現呢?

除了StyleCop外,Visual Studio Team System 2008也提供Code Analysis,

事先定出一些常用的規則來檢視程式碼,並會提出警告,

當然它也提供選項可讓警告視為錯誤。

image

從上圖可得知,Code Analysis包含11類共兩百多條規則,

在此我要探討的是與Coding Style最相關的規則-命名規則(Naming Rules)。

image

若我們的需求範圍多過這些規則,那就撰寫Custom Rules吧!!

在此我將試做一個常數命名必須全部大寫的Custom Rules。

步驟如下:

step1:

下載FxCop

FxCop是微軟內部的元件,可讓我們自訂VSTS2008的程式碼分析的Custom Rules。

step2:

建立一個類別庫。

image

step3:

將FxCopSdk.dll和Microsoft.Cci.dll加入參考。

這兩個dll檔會放在C:\Program Files\Microsoft FxCop 1.36這個路徑底下。

image

step4:

新增一個類別(Class).cs項目。

並using Microsoft.FxCop.Sdk;

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using Microsoft.FxCop.Sdk;
   6:  
   7: namespace CustomRules
   8: {
   9:     public class ConstRule:BaseIntrospectionRule
  10:     {
  11:         public ConstRule() :
  12:             base("ConstRule", "CustomRules.ConstRule",
  13:             typeof(ConstRule).Assembly)
  14:         {
  15:         }
  16:  
  17:         public override ProblemCollection Check(Member member)
  18:         {
  19:             Field f = member as Field;
  20:  
  21:             if (f == null)
  22:                 return null;
  23:  
  24:             else
  25:             {
  26:                 // 判斷是否為Constant
  27:                 if (f.IsLiteral)
  28:                 {
  29:                     bool error = false;
  30:  
  31:                     foreach (char cha in f.Name.Name.ToCharArray())
  32:                     {
  33:                         //當字元檢查非大寫英文字母則為違反規則
  34:                         //if ((int)cha < 65 || (int)cha > 90)
  35:                         if (!char.IsUpper(cha))
  36:                         {
  37:                             error = true;
  38:                             break;
  39:                         }
  40:                     }
  41:  
  42:                     if (error == true)
  43:                     {
  44:                         Problems.Add(new Problem(GetResolution(member.Name.Name)));
  45:                     }              
  46:                 }
  47:             }
  48:  
  49:             return Problems;
  50:         }    
  51:     }
  52: }

撰寫Custom Rules的重點包括:

1. 必須繼承「BaseIntrospectionRule」類別。

2. 建構式有3個參數:

  2-1. Custom Rule的名稱,要和XML設定檔的標籤值一樣。

  2-2. XML設定檔名稱,但不包括「.xml」。(就是跟Build出來的dll檔名字一樣)

  2-3. 包含此XML設定檔之組件。

3. override檢查方法,那是一個多載函式,包括六種方法:

  3-1. Check (ModuleNode module)。

  3-2. Check (Resource resource)。

  3-3. Check (String namespaceName, TypeNodeCollection types):檢查namespace。

  3-4. Check (TypeNode type): 檢查Class、Struct等Type。

  3-5. Check (Member member):檢查Method、Property、Field等。

  3-6. Check (Parameter parameter)。

4. GetResolution()是從 XML設定檔取得問題的描述,再將問題加入ProblemCollection類別中。

step5:

新增一個XML檔。

標準格式如下面範例:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2:  
   3: <Rules FriendlyName="CustomRules">
   4:  
   5:   <Rule TypeName="ConstRule" Category="Dot Net" CheckId="Rule1">
   6:  
   7:     <Name>ConstRule </Name>
   8:  
   9:     <Description>A constant name should start with a letter, use all uppercase letters.</Description>
  10:  
  11:     <Url></Url>
  12:  
  13:     <Resolution>Constant name '{0}' should use all uppercase letters.</Resolution>
  14:  
  15:     <Email></Email>
  16:  
  17:     <MessageLevel Certainty="99"> Warning</MessageLevel>
  18:  
  19:     <FixCategories> Breaking </FixCategories>
  20:  
  21:     <Owner></Owner>
  22:  
  23:   </Rule>
  24:  
  25: </Rules>

step6:

記得將XML檔屬性內的建置動作改為「內嵌資源」。

image 

step7:

將Build好的dll檔放到Visual Studio的安裝路徑下就大功告成拉^^~

C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop \Rules

接著就可以在Code Analysis看到我們剛剛寫的Rule囉!!

image

step8:

寫一個簡單的範例觀察常數不是大寫時是否會提出警告。

   1: using System;
   2:  
   3: namespace WebApplication2
   4: {
   5:     public partial class WebForm2 : System.Web.UI.Page
   6:     {
   7:         protected void Page_Load(object sender, EventArgs e)
   8:         {
   9:             const double PI=0.3;
  10:             const double Pi = 0.3;
  11:             const double pi = 0.3;
  12:         }
  13:     }
  14: }

果然秀出警告訊息:

image

第一個Custom Rule測試成功囉:)

 

參考資料:

http://www.sql-server-performance.com/articles/dev/fxcop_custom_rules_p2.aspx

http://code.msdn.microsoft.com/sourceanalysis

http://msdn.microsoft.com/zh-tw/vsts2008/products/default.aspx

http://msdn.microsoft.com/en-us/library/bb429476(VS.80).aspx