我有从ANTLR生成的C#代码。如何判断stylecop / fxcop / visual studio代码分析在检查时忽略此文件?
答案 0 :(得分:3)
对于FxCop,最终方法是使用[GeneratedCode]
属性修饰代码并禁用检查生成代码的选项。 VS和/或FxCop版本的细节不同;请参阅此correct usage of the attributes的博文。
StyleCop会忽略该属性,但您还有其他一些选项:
<auto-generated />
。此外,这两个工具的最新版本似乎忽略了在其名称中包含短语“生成代码”的区域内的代码。例如,在Windows Forms * .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
Code Analysis和StyleCop都会忽略该区域内的代码,但仍然会针对此文件的其余部分运行。 (如果您设置了“忽略设计器文件”选项,当然,StyleCop将忽略整个文件,因为它以.Designer.cs结尾。)
令人非常沮丧的是,这两个工具似乎无法就如何忽略代码达成一致(几乎与自动生成代码的数量一样令人沮丧,因为这些代码无法正常排除自己 - 在这里看着你,EF。 )问题是代码分析检查您的编译代码(具有属性元数据但没有注释),而StyleCop检查您的源代码(元数据属性的范围更难跟踪,尽管它仍然可能)。
在我的模板中,我倾向于使用多种选项:我在其中包含一个带有<auto-generated>
标记的StyleCop感知标头,然后用[GeneratedCode]
装饰每个代码元素,它似乎抓住一切。 (可能不言而喻,我的自动生成的代码也很难在第一时间内违反规则:))
答案 1 :(得分:1)
另一种方法可能是使用@headers。
@lexer::header {
#pragma warning disable 1591
}
@parser::header {
#pragma warning disable 1591
}
答案 2 :(得分:1)
嗯,我注意到ANTLR生成的文件是部分&#39;所以我刚刚创建了第二个文件,添加了相同的类,部分&#39;没有具有任何字段或方法的类,但在类中添加了以下属性:
[GeneratedCodeAttribute(&#34; ANTLR&#34;,&#34; 3.0.0.0&#34;)]
然后我检查了这个文件,进入TFS源代码控制。像这样,类具有生成的代码属性集,CodeAnalysis / FxCop将忽略整个类。但是您必须配置CodeAnalysis,以便不检查自动生成的代码(设置为选中的相应复选框)。