代码分析的不稳定执行

Flaky execution of Code Analysis

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

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

我想知道代码分析有时会停止工作的原因是什么。不幸的是,我还没有想出重现这个的方法 - 因此我的问题。

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

关于如何从 NuGet 加载 Roslyn 分析器

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

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

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

关于为什么分析器有时会失败

这个不好说。存储项目的一些元数据。设置选项以清除 workspace/working 目录并重新开始可能会解决此问题。 Setting the build.clean variable to all should help with that. 删除 binobj.vs 文件夹以及 packages 文件夹并执行 nuget 还原 + 构建应该可以使您恢复可用状态.

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

There seems to be an option built into Roslyn to enable ETW Logging,这应该会给你更多的细节,但这不是很好的记录。

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