代码分析改进

Bra*_* Ds 5 .net msbuild code-analysis visual-studio static-code-analysis

静态CA使解决方案构建变得更慢.在我的情况下>比没有CA慢2倍.我们可以禁用它,但这是失去力量的坏决定.所以,我们能做些什么?

首先让我们看看CA的工作原理.

你建立解决方案.在每个项目构建之后,msbuild编译目标fxcopcmd.exe被调用,其中包含应该分析的程序集的路径.fxcopcmd.生成由VS(或可能是输出流)使用的CA xml日志.fxcopcmd.exe加载程序集(快速)并同步分析它,因此只加载一个CPU而3个(在我的情况下)什么都不做.只有在CA完成后,才会构建项目依赖关系链中的下一个项目.

因此,CA中的弱点是我们可以改进它 - 强制它并行工作以使用所有CPU.

我看到这样的解决方案

要制作将从MSBUILD中获取参数的假fxcopcmd.exe,请记住它并立即向msbuild报告一切正常并且没有错误(通过CA xml.log或成功文件,或者可能是流..).所以MSBUILD将构建下一个项目,那时我们将使用保存的参数调用真正的fxcopcmd.exe ...如果MSBUILD将在下一个项目中调用fxcopcmd.exe - 我们将再次调用fxcopcmd.exe ...所以会有很少有加载所有CPU的进程.真正的fxcopcmd.exe完成后我们可以调用我们的MSBUILD目标,它将从microsoft.common.targtets只调用CA目标而没有编译,我们的假fxcopcmd.exe会立即报告结果(CA在那时完成,我们有日志)到MSBUILD-VS.

你怎么看?这会加速CA吗?为什么Microsoft没有在CA中创建这样的人员并且只使用一个CPU?

jes*_*ing 4

我曾经在 Connect 上问过类似的问题,并直接得到了团队的回复。在 2012 年的 ALM 峰会上,我讨论了这个话题,原因有很多(排名不分先后)

  • 一旦 Project Roslyn 集成到 Visual Studio 产品中,代码分析引擎很可能会被替换。Roslyn 将提供实时分析(如 Resharper)和“修复”发现的问题的能力。
  • 该引擎是 CPU 密集型的,并且已经使用多个 CPU,因此运行多个实例可能不会像您想象的那样对您有帮助。此外,fxcop 可能是 I/O 密集型(加载程序集、pdb 和其他文件),当您同时加载多个实例时,情况只会变得更糟。
  • 构建引擎需要访问构建输出。供参考,也可用于其他任务。因此,它需要知道任务完成后文件不再使用。例如,当您添加一个将多个程序集合并在一起并随后删除旧程序集的任务时,它需要访问这些文件。简单的移动/打包/等操作也是如此。
  • 当发现代码分析问题(设置为 level=error)时,尽早使构建失败的能力将不起作用,因为您只是在最后收集结果。可能会导致您构建所有内容,却发现您无法使用最终结果。

正如您在此 MSDN 论坛帖子中所看到的,Fxcop 本身已经使用了多个线程,并且(至少在 2010 年附带的规则中)已经存在一些并发问题,导致我们在某些情况下关闭 Fxcop 的并发性。如果您希望 fxcop 使用更多(或更少)线程,您可以编辑该fxcopcmd.exe.config文件:

 <FxCopEngineSettings Version="1.32">
   <Engines>
     <Engine Name="Introspection" Enabled="True">
       <!-- Change this number to use more (or fewer) threads -->
       <Threading Count="1" />
       <EnableFlowAnalysis>True</EnableFlowAnalysis>
     </Engine>
   </Engines>
 </FxCopEngineSettings>
Run Code Online (Sandbox Code Playgroud)

尽管论坛帖子提到了 Visual Studio 2008,但我也应用它来解决 2010 的问题。

提高 FxCop 效率的最简单方法是在编译所有项目后调用一次。这将导致它仅加载所有符号和引用的程序集一次,并将允许引擎最大限度地利用并行性。当您有一个混合多个目标平台和 CPU 的解决方案时,或者当您想要对不同的项目使用不同的 .rules 文件时,也会出现一些问题。

或者您可以执行与我相同的操作,即为本地解决方案配置 FxCop,但不将其设置为在每个构建上运行。然后在 Team Foundation Server Team Build(或您可能使用的任何其他构建服务器)中,覆盖 FxCop 的配置以“始终”运行。这样,您在构建本地解决方案时不会对性能产生影响。它仍然允许您在本地(从“分析”菜单项)运行整个解决方案的代码分析,并且自动构建可以防止您签入有问题的代码。