【问题标题】:Flaky execution of Code Analysis代码分析的不稳定执行
【发布时间】:2018-01-03 20:08:12
【问题描述】:

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

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

我想知道代码分析有时会停止工作的原因是什么。不幸的是,我还没有想出一种方法来重现这一点——这就是我的问题。

事实上,我很想知道为什么将 NuGet 添加到项目中会完全改变编译过程的结果。那个魔法是怎么起作用的?欢迎大家指点。

【问题讨论】:

  • 1 月 18 日发布的当前最新版本(2.6.0 最终版)是否仍然存在您的问题?或者它可能固定在那里?
  • 在 2.6.0 中,我收到一大堆 CSC : warning CS8032: An instance of analyzer Microsoft.NetFramework.CSharp.Analyzers.[...]Analyzer cannot be created from [...]\.nuget\packages\microsoft.netframework.analyzers\2.6.0\analyzers\dotnet\cs\Microsoft.NetFramework.CSharp.Analyzers.dll : Could not load file or assembly 'Microsoft.CodeAnalysis, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.. 警告。似乎是一个不同的问题,让我更加没有信心。

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


【解决方案1】:

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

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

MsBuild 会将项目文件中的 analyzers 引用传递给对 Roslyn 编译器的调用,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,这应该可以帮助您找出问题可能来自哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2011-06-09
    • 2018-02-15
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多