考虑这段代码,它包含在一个文件中:
namespace Foo
{
public partial class One
{
}
}
namespace Baa
{
public partial class Two
{
}
}
编译此代码会产生两个StyleCop警告:
抑制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?
谢谢,
电子
P.S。请压制一下,提醒我单个文件中的多个名称空间表现出错误的编程习惯......
编辑(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
标记是否正在撤销所有其他设置文件。这似乎是合乎逻辑的,但是,如果是这样,我所看到的行为意味着在使用SourceFileList
的构建中不可能使用StyleCopOverrideSettingsFile
。
或者,可能只是Settings.StyleCop
是错误的文件名,或者我把它放在错误的位置(我把它放在csproj文件旁边。
编辑(20130425):
最终我放弃了。有问题的代码是由visual studio模板文件(.TT)自动生成的,所以我付出了额外的努力,使模板代码将命名空间拆分成单独的文件。
答案 0 :(得分:8)
您需要设置抑制的范围。在这种情况下,请使用“module”。
[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace", Justification = "This is a generated file which generates all the necessary support classes.")]
我从以下页面的“Gobal-Level Suppressions”部分了解到这一点: http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4
答案 1 :(得分: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>
答案 2 :(得分:1)
我发现了更简单的方法,也许它有助于某人。 您可以右键单击您的项目并选择StyleCop Settings。
弹出窗口将打开,您可以在那里自定义警告并选择要抑制的内容。在您的情况下,可以在可维护性规则\文件内容
上找到交战SA1403答案 3 :(得分:0)