【发布时间】:2012-11-11 03:12:05
【问题描述】:
考虑一下这段代码,它包含在一个文件中:
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?
谢谢,
E
附:请抑制提醒我单个文件中的多个命名空间表明不良编程习惯的冲动...
编辑(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) 自动生成的,因此我付出了额外的努力,使模板代码将命名空间拆分为单独的文件。
【问题讨论】:
-
在单个文件中使用多个命名空间演示了 ba......哦,你已经说过了:P。说真的,StyleCop 可以帮助您避免不良做法,但是您想忽略它并仍然这样做吗?你反对使用它:)。