2012-11-22 67 views
7

考慮以下代碼,其被包含在單個文件中:如何禁止StyleCop警告SA1403?

namespace Foo 
{ 
    public partial class One 
    { 
    } 
} 

namespace Baa 
{ 
    public partial class Two 
    { 
    } 
} 

編譯此代碼產生兩個StyleCop的警告:

  • SA1402:FileMayOnlyContainASingleClass
  • SA1403:FileMayOnlyContainASingleNamespace

抑制SA1402按預期工作:

namespace Foo 
{ 
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")] 
    public partial class One 
    { 
    } 
} 

namespace Baa 
{ 
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]   
    public partial class Two 
    { 
    } 
} 

不幸的是,我似乎無法抑制SA1403。

我嘗試了以下抑制上述每個類(按照SA1402抑制):

[SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")] 

我也試着下面裝配水平抑制,無論是在文件的頂部和在我的全局抑制文件(我意識到這不是一個明智的主意):

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")] 

但無濟於事。

所以,我的問題是:如何壓制StyleCop警告SA1403?

感謝,

Ë

附:請抑制的衝動,提醒我,在一個文件中多個命名空間演示了不好的編程習慣......

EDIT(20121127): 與Mightymuke的答案,我已經研究過使用SourceFileList的可能性線。

我們在我們的版本中使用StyleCopOverrideSettingsFile標籤,該標籤指向共享規則文件。在與Mightymuke的建議路線,添加以下到我們的文件:

<SourceFileList> 
    <SourceFile>MyFileName.cs</SourceFile> 
    <Settings> 
     <Analyzers> 
     <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules"> 
      <Rules> 
      <Rule Name="FileMayOnlyContainASingleNamespace"> 
       <RuleSettings> 
       <BooleanProperty Name="Enabled">False</BooleanProperty> 
       </RuleSettings> 
      </Rule> 
      </Rules> 
     </Analyzer> 
     </Analyzers> 
    </Settings> 
    </SourceFileList> 

這也不能工作。

但我相信,這可能是設計。我找到了一個StyleCop bug report,暗示SourceFileList標籤不能在比項目級更高的級別上使用。

考慮到這些信息,我試圖在項目級添加一個Settings.StyleCop文件。

還是沒有喜樂。

我現在正在研究StyleCopOverrideSettingsFile標記正在消除所有其他設置文件的可能性。這似乎是合乎邏輯的,但如果是這樣的話,我所看到的行爲意味着在一個也使用StyleCopOverrideSettingsFile的版本中使用SourceFileList是不可能的。 另外,它可能只是Settings.StyleCop是錯誤的文件名,或者我把它放在錯誤的位置(我把它放在csproj文件旁邊。

編輯(20130425):

最終我放棄了。有問題的代碼是由Visual Studio模板文件(.TT)自動生成的,所以我花了額外的努力使模板代碼將命名空間拆分爲單獨的文件。

+0

在單個文件中使用多個名稱空間演示ba ......哦,你已經說過:P。儘管如此,StyleCop可以幫助你避免不良行爲,但是你想忽略它並且不管怎麼做?你會反對它的使用:)。 – mattytommo

回答

3

您將需要在設置文件中創建一個File List

從文檔:

Now consider a situation where you’d like to disable some additional rules for a 
couple of specific files in the project, Class3.cs and Class4.cs. In StyleCop 
4.4, this can be accomplished by adding a <SourceFileList> section within the 
settings file: 
<SourceFileList> 
    <SourceFile>Class3.cs</SourceFile> 
    <SourceFile>Class4.cs</SourceFile> 
    <Settings> 
    <Analyzers> 
     <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules"> 
     <Rules> 
      <Rule Name="AccessModifierMustBeDeclared"> 
      <RuleSettings> 
       <BooleanProperty Name="Enabled">False</BooleanProperty> 
      </RuleSettings> 
      </Rule> 
     </Rules> 
     </Analyzer> 
    </Analyzers> 
    </Settings> 
</SourceFileList> 

在特定情況下,它應該是這個樣子:

<SourceFileList> 
    <SourceFile>YourFile.cs</SourceFile> 
    <Settings> 
    <Analyzers> 
     <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules"> 
     <Rules> 
      <Rule Name="FileMayOnlyContainASingleClass"> 
      <RuleSettings> 
       <BooleanProperty Name="Enabled">False</BooleanProperty> 
      </RuleSettings> 
      </Rule> 
      <Rule Name="FileMayOnlyContainASingleNamespace"> 
      <RuleSettings> 
       <BooleanProperty Name="Enabled">False</BooleanProperty> 
      </RuleSettings> 
      </Rule> 
     </Rules> 
     </Analyzer> 
    </Analyzers> 
    </Settings> 
</SourceFileList> 
+0

有趣的是,我不知道這一點。 –

5

您需要設置抑制的範圍。在這種情況下,使用「模塊」。

[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace", Justification = "This is a generated file which generates all the necessary support classes.")] 

我學會了這從以下頁面,在「Gobal級鎮壓」一節中: http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4

1

我發現了更簡單的方式做到這一點,也許它可以幫助別人。 您可以右鍵點擊您的項目並選擇StyleCop Settings

彈出窗口將打開,您可以自定義警告並選擇要抑制的內容。在你的情況下,可以在維修規則中找到SA1403的交戰\文件內容