【发布时间】:2012-03-19 03:07:44
【问题描述】:
我有从 ANTLR 生成的 C# 代码。如何告诉 stylecop/fxcop/visual studio 代码分析在检查时忽略此文件?
【问题讨论】:
标签: visual-studio-2010 antlr stylecop
我有从 ANTLR 生成的 C# 代码。如何告诉 stylecop/fxcop/visual studio 代码分析在检查时忽略此文件?
【问题讨论】:
标签: visual-studio-2010 antlr stylecop
对于 FxCop,确定的方法是使用 [GeneratedCode] 属性装饰您的代码并禁用检查生成代码的选项。 VS 和/或 FxCop 版本之间的细节有所不同;请参阅此博客文章以获取 correct usage of the attributes。
StyleCop 会忽略该属性,但您还有其他一些选择:
<auto-generated />。此外,这两种工具的最新版本似乎都忽略了名称中包含短语“生成的代码”的区域内的代码。例如,在您的 Windows 窗体 *.Designer.cs 文件中,您将看到:
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent ( )
{
// stuff here
}
#endregion
代码分析和 StyleCop 都会忽略该区域内的代码,但仍会针对该文件的其余部分运行。 (如果您设置了“忽略设计器文件”选项,StyleCop 将忽略整个文件,因为它以 .Designer.cs 结尾。)
这两个工具似乎无法就如何忽略代码达成一致,这非常令人沮丧(几乎就像自动生成的代码数量一样令人沮丧,而这些代码却无法正确排除自身 - 看看你,EF。 ) 问题在于,代码分析会检查您的编译代码(具有属性元数据但没有 cmets),而 StyleCop 会检查您的源代码(其中元数据属性的范围更难跟踪,但仍有可能)。
在我的模板中,我倾向于使用多种选项:我在其中包含一个带有 <auto-generated> 标记的 StyleCop 感知标头,然后用 [GeneratedCode] 装饰每个代码元素,它似乎可以捕获所有内容。 (可能不言而喻,我的自动生成的代码也非常努力地不首先违反规则:))
【讨论】:
另一种方法可能是使用@headers。
@lexer::header {
#pragma warning disable 1591
}
@parser::header {
#pragma warning disable 1591
}
【讨论】:
好吧,我注意到 ANTLR 生成的文件是“部分”的,所以我刚刚创建了第二个文件,添加了与“部分”相同的类,但该类没有任何字段或方法,但将以下属性添加到类:
[GeneratedCodeAttribute("ANTLR", "3.0.0.0")]
然后我将此文件签入到 TFS 源代码管理中。像这样,类具有生成的代码属性集,CodeAnalysis/FxCop 将忽略整个类。但是您必须配置 CodeAnalysis,以不检查自动生成的代码(适当的复选框设置为选中)。
【讨论】: