如何抑制 StyleCop 警告?
Posted
技术标签:
【中文标题】如何抑制 StyleCop 警告?【英文标题】:How to suppress a StyleCop warning? 【发布时间】:2011-03-18 06:57:33 【问题描述】:我正在使用 StyleCop 并想取消一些不适合我的风格的警告。我更喜欢有解决方案
1) 内嵌代码抑制 2) 全局设置抑制
我已经搜索了互联网,但still not sure 如何进行抑制。
对于方法1),他们说要添加行:
[程序集:SuppressMessage("Microsoft.Design", "SA1202:所有私有方法必须放在所有公共方法之后", 范围=“命名空间”,目标=“Consus.Client.ClientVaultModule.Services.OnlineDetection”)]
但他们没有说明要使用的位置和名称空间。
对于方法 2),他们说要使用 GlobalSuppress 文件,但目前似乎不太容易搜索操作方法。
请帮忙。
[已编辑] 就我而言,我收到了关于 SA1202:所有私有方法必须放在所有公共方法之后 的警告,这很麻烦,因为我将相关代码分组到区域中。我想仅针对某些特定方法抑制这些警告。
【问题讨论】:
理想情况下,右键单击,“抑制”(或右键单击,“修复”)。但是 StyleCop 是由受虐狂编写的,因此您必须手动解决所有问题,非常繁琐。如果曾经有设计由机器完成的工作,就是这样。真是浪费。 【参考方案1】:这是你需要的:
[SuppressMessage("Microsoft.StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess")]
【讨论】:
那两条魔线是怎么推导出来的?发布的所有 OP 都是代码“SA1202”。我有一个类似的问题(代码'SP0100'),我无法推断出相应的字符串。 @Colonel Panic:您可以在运行 StyleCop 警告消息时获取第一个字符串。例如。 “SA1202:CSharp.OrderingRules:blahblah”。然后使用编辑器打开 StyleCop 设置文件并使用 SA 代码搜索以找到实际规则及其简称。 如果您转到stylecop.com/docs/SA1202.html(或其他警告的类似页面网址),您可以找到抑制消息语法的非常清晰的详细信息。 @Seph Alas,不适用于我的 Style Cop 信天翁“SP0100”。 stylecop.com/docs/SP0100.html 的网页是 404 未找到。 他们的文档在这里更新:github.com/DotNetAnalyzers/StyleCopAnalyzers/tree/master/…【参考方案2】:内联抑制的示例与此类似 - 检查代码中的命名空间与抑制相比
namespace Soapi
///<summary>
///</summary>
///<param name = "message"></param>
///<param name = "statusCode"></param>
///<param name = "innerException"></param>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object)")]
public ApiException(string message, ErrorCode statusCode, Exception innerException)
: base(String.Format("0\r\nStatusCode:1", message, statusCode), innerException)
this.statusCode = statusCode;
全局抑制文件是项目根目录中名为 GlobalSuppressions.cs
的文件,可能如下所示:
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
//
// To add a suppression to this file, right-click the message in the
// Error List, point to "Suppress Message(s)", and click
// "In Project Suppression File".
// You do not need to add suppressions to this file manually.
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object,System.Object)", Scope = "member", Target = "Soapi.ApiException.#.ctor(System.String,Soapi.ErrorCode,System.String,System.Exception)")]
您可以通过右键单击警告自动生成此代码。
【讨论】:
我尝试右键单击警告(在错误/警告列表中),但没有上下文菜单项允许我抑制它。我正在使用 VS 2010。你知道为什么吗? @Nam - 不确定,我举的例子是使用 vs2008。让我启动 2010 年并看一看。 @poet:我已经在这里发布了我的相关问题***.com/questions/3287957/… @Nam - 与 2010 相比有一些问题 - 需要几个小时。如果你还没有得到一个好的答案,那么我会报告回来。但实际上它应该是非常相似的过程。到那时.. 嗯,我猜你不能在 StyleCop 警告中使用上下文菜单。我展示的那些来自 FxCop。但是 - 抑制语法是相同的。所以我猜你的问题是找到你正在打破的规则的命名空间,以便你可以手动抑制,对吧?【参考方案3】:从 StyleCop 4.3.2 开始,可以通过在源代码中添加抑制属性来抑制违反规则的报告。
规则抑制 http://stylecop.soyuz5.com/Suppressions.html
但它说-
全局抑制
StyleCop 不支持全局抑制或 文件级抑制。抑制必须放在代码上 元素。
【讨论】:
这里也提供了相同的信息 - blogs.msdn.com/b/sourceanalysis/archive/2009/08/10/…【参考方案4】:如果你已经安装了 StyleCop,你可以右击你的项目,会有一个 StyleCop 选项。单击此按钮,您将看到您甚至可以阻止某些规则对您的项目运行。此外,您可以创建单独的规则文件以在不同项目之间共享。这意味着您可以按照自己的方式配置规则,然后在所有项目之间共享该配置。
对于个人覆盖,SuppressMessage
是可行的方法。
【讨论】:
在 VS 2019 中你不能再这样做了。 我正在使用 Visual Studio 2019,版本 16.7.3 并确认 @aBlaze 的建议不起作用。【参考方案5】:-
转到解决方案资源管理器
转到您的项目
扩展参考文献
扩展分析器
扩展 StyleCop.Analyzers
右键单击要在全局(项目)级别禁用的特定规则
设置规则集严重性 -> 选择无
【讨论】:
【参考方案6】:阅读 Style Cop 的警告,寻找字母数字代码。在你的情况下'SA1202'。然后浏览到 Style Cop 网站上的相应页面。酌情更改网址https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1202.md
复制标有“如何禁止违规”的行。将属性粘贴到 Style Cop 抱怨的类上方
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Reviewed.")]
【讨论】:
【参考方案7】:您不能只删除规则而不污染您的代码吗?
FxCop 也是如此...
【讨论】:
我刚刚添加了我无法获取代码的原因。请查看我编辑的问题。【参考方案8】:1。
在您的情况下,正确的 SuppressMessage
属性应如下所示:
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess")]
private void SomeMethod()
请注意,您可以将它放在任何其他元素上(例如,放在类上 - 然后整个类中的所有类似违规行为都将被禁止)。
我也同意在这些字段中写什么是相当不明显的。
实际上,第一个应该是StyleCop 分析器类 的完全限定名称,可以从源代码中找到(例如来自here)。 第二个应该以 rule code 开头,然后是冒号和 rule enumeration 的名称(幸运的是,它总是看起来像设置编辑器中显示的规则名称,但带有没有空格)。
2。 关于“全局”抑制规则 - 为什么不通过设置编辑器将它们关闭?设置文件是通过文件系统继承的,因此您可以轻松地在文件夹结构的“顶部”拥有一个“主”设置文件,以及一些其他文件(与主文件保持“差异”),但某些项目除外,如果您愿意(如here 所述)。
祝你好运!
【讨论】:
【参考方案9】:您可以在项目根文件夹中的 Settings.StyleCop 文件中禁用不需要的规则。 您将需要包含规则的命名空间,可在此处找到: http://stylecop.soyuz5.com/StyleCop%20Rules.html
Settings.stylecop 文件代码供大家参考:
<StyleCopSettings Version="105">
<Analyzers>
<Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
<Rules>
<Rule Name="ElementsMustBeSeparatedByBlankLine">
<RuleSettings>
<BooleanProperty Name="Enabled">False</BooleanProperty>
</RuleSettings>
</Rule>
</Rules>
<AnalyzerSettings />
</Analyzer>
</Analyzers>
</StyleCopSettings>
【讨论】:
如果您可以显示一些 OP 可能需要的示例设置,这将更有帮助。【参考方案10】:或者,您可以将区域中的代码移动到部分类中。那么 stylecop 规则的问题就会消失。
【讨论】:
【参考方案11】:除了已有的有用答案:
如果您在抑制文件GlobalSuppressions.cs
中抑制警告,
您可以编辑 [assembly: SuppressMessage(StyleCop...blabla
行并完全删除 Scope=...
和 Target=...
标记。这使得抑制在项目中成为全局性的。
【讨论】:
【参考方案12】:Visual Studio 2015+ 使用的StyleCop.Analyzers NuGet 包的README.md 包含指向documentation for the rules 的链接。每个规则的文档都包含“如何禁止违规”部分。对于SA1202 rule,选项有:
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Reviewed.")]
和
#pragma warning disable SA1202 // ElementsMustBeOrderedByAccess
#pragma warning restore SA1202 // ElementsMustBeOrderedByAccess
【讨论】:
以上是关于如何抑制 StyleCop 警告?的主要内容,如果未能解决你的问题,请参考以下文章