代码分析的片状执行

时间:2018-01-03 20:08:12

标签: c# .net-core code-analysis fxcop roslyn-code-analysis

我正在尝试为我的.NET Standard 2.0类库进行代码分析。如上所述here,我添加了对Microsoft.CodeAnalysis.FxCopAnalyzers的引用。一开始,一切都很好看,我在构建项目时开始收到CA *警告。然而,过了一段时间,虽然我没有触及代码,但这些警告消失了。

仅在关闭VS 2017后,删除所有bin目录,重启VS 2017,我才开始收回CA *警告。然而,这似乎并不是让他们回归的方法:在我的CI环境中,同样的事情发生了。我在一次不相关的提交后丢失了警告,虽然我已经完全清理了结帐目录,但仍然无法将它们带回来。

我想知道代码分析何时停止工作的原因可能是什么。不幸的是,我还没有找到一种方法来重现这一点 - 因此我的问题。

事实上,我很想知道为什么在项目中添加NuGet可以完全修改编译过程的结果。这魔术是如何运作的?欢迎任何指示。

1 个答案:

答案 0 :(得分:1)

关于如何从NuGet

加载Roslyn分析器

新的C#和VB编译器基于Roslyn。 Roslyn是一个可扩展的编译器框架,其中许多分析器可以在编译过程的不同阶段运行。

MsBuild会将项目文件中的analyzers引用传递给对Roslyn编译器的调用,后者将依次加载这些引用,并在解析和解释源代码后执行它们。

NuGet包具有特殊元数据,可确保将这些分析器添加为MsBuild项目文件的特殊类型的引用,以便MsBuild可以将这些分析器传递给编译器。

至于分析仪有时会失败的原因

这很难说。存储了一些项目元数据。设置选项以清除工作区/工作目录并重新开始可能会解决此问题。 Setting the build.clean variable to all should help with that.删除binobj.vs文件夹以及packages文件夹并执行nuget restore + build会使您恢复到可用状态

新的FxCop分析仪项目仍未完成,仍在更新中。分析器基础结构中的错误可能导致分析失败。不幸的是,这通常很难调试。逐个关闭规则可能会帮助你找到罪魁祸首。

There seems to be an option built into Roslyn to enable ETW Logging,它可以为您提供更多详细信息,但目前还没有详细记录。

在Visual Studio中还有另一件事可以打破分析器,Visual Studio Extensions也可以加载分析器,然后Visual Studio将注入到构建过程中。这些扩展不是您项目的一部分,因此不会以任何方式显示在源代码管理中。因此,任何最近更新的扩展也可能是罪魁祸首。将MsBuild详细级别设置为Diagnostics应该会向您显示传递给csc的分析器,这可以帮助您找出问题的来源。