2012-11-22 16 views
7

xem xét mã này, mà được chứa trong một tập tin duy nhất:Làm cách nào để ngăn chặn cảnh báo StyleCop SA1403?

namespace Foo 
{ 
    public partial class One 
    { 
    } 
} 

namespace Baa 
{ 
    public partial class Two 
    { 
    } 
} 

Biên dịch mã này kết quả trong hai cảnh báo StyleCop:

  • SA1402: FileMayOnlyContainASingleClass
  • SA1403: FileMayOnlyContainASingleNamespace

Ức chế SA1402 hoạt động như mong đợi:

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 
    { 
    } 
} 

Thật không may, tôi dường như không thể loại bỏ SA1403.

Tôi đã thử các ức chế sau trên mỗi lớp học (theo cuộc đàn áp SA1402):

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

Tôi cũng đã thử các ức chế mức độ lắp ráp sau, cả hai đều ở phía trên cùng của tập tin và trong tập tin ức chế toàn cầu của tôi (tôi nhận ra đó không phải là một ý tưởng hợp lý):

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

Nhưng vô ích.

Vì vậy, câu hỏi của tôi là: Làm cách nào để ngăn chặn cảnh báo StyleCop SA1403?

Cảm ơn,

E

T.B. Xin vui lòng ngăn chặn các yêu cầu để nhắc nhở tôi rằng nhiều không gian tên trong một tập tin thể hiện thực hành lập trình xấu ...

EDIT (20121127): Phù hợp với câu trả lời của Mightymuke Tôi đã xem xét khả năng sử dụng SourceFileList.

Chúng tôi sử dụng thẻ StyleCopOverrideSettingsFile trong bản dựng của chúng tôi, trỏ đến tệp quy tắc được chia sẻ. Phù hợp với gợi ý của Mightymuke, tôi đã thêm phần sau vào hồ sơ của chúng tôi:

<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> 

Điều này cũng không có tác dụng.

Tôi tin rằng, tuy nhiên điều này có thể là do thiết kế. Tôi đã tìm thấy một số StyleCop bug report đề xuất không thể sử dụng thẻ SourceFileList ở cấp cao hơn cấp dự án.

Với thông tin này, tôi đã cố gắng thêm tệp Settings.StyleCop ở cấp dự án.

Vẫn không có niềm vui.

Tôi hiện đang xem xét khả năng thẻ StyleCopOverrideSettingsFile đang quashing mọi tệp cài đặt khác. Điều này có vẻ hợp lý nhưng, nếu có, hành vi tôi đã thấy sẽ ngụ ý không thể sử dụng SourceFileList trong bản dựng cũng sử dụng StyleCopOverrideSettingsFile. Hoặc, có thể đơn giản là Settings.StyleCop là tên tệp sai hoặc tôi đã đặt sai vị trí đó (tôi đặt nó bên cạnh tệp csproj.

EDIT (20130425):

Cuối cùng tôi đã từ bỏ. Mã được đề cập đã được tạo tự động bởi tệp mẫu studio trực quan (.TT), vì vậy tôi đã đi đến nỗ lực bổ sung để tạo mã mẫu tách các không gian tên thành các tệp riêng biệt.

+0

Sử dụng nhiều không gian tên trong một tập tin duy nhất chứng tỏ ba ...... oh bạn đã nói rằng: P. Nghiêm túc, StyleCop là có để giúp bạn tránh thực hành xấu, nhưng bạn muốn bỏ qua nó và làm điều đó không? Bạn đang đi ngược lại việc sử dụng nó :). – mattytommo

Trả lời

3

Bạn sẽ muốn tạo một File List trong tập tin cài đặt.

Từ các tài liệu:

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> 

Trong trường hợp cụ thể của bạn nó sẽ giống như thế:

<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

Thú vị, tôi không biết điều này. –

5

Bạn cần phải thiết lập phạm vi của cuộc đàn áp. Trong trường hợp này, sử dụng "module".

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

Tôi học được điều này từ trang sau, trong "Gobal Cấp đàn áp" phần: http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4

1

tôi phát hiện ra cách đơn giản để làm điều đó, có lẽ nó giúp một ai đó. Bạn có thể nhấp chuột phải vào dự án của mình và chọn StyleCop Settings.

Popup sẽ mở ra và ở đó bạn có thể tùy chỉnh cảnh báo và chọn những gì bạn muốn ngăn chặn. Trong trường hợp bạn, chiến SA1403 có thể được tìm thấy về Quy tắc Bảo trì \ file Nội dung