【问题标题】:Doing .NET 4.0 static code analysis (FxCop) with VS 2010 Professional使用 VS 2010 Professional 进行 .NET 4.0 静态代码分析 (FxCop)
【发布时间】:2010-10-06 12:02:45
【问题描述】:

我有 VS 2010 Professional(与 Premium 不同,它包括访问 IDE 中的代码分析配置),以及包含许多项目的 C# 4 解决方案。我想将静态代码分析作为解决方案编译的一部分。

我在 SO 和 Google 的帮助下确定的可能方法是:

  • 编辑解决方案中的每个 .csproj,以将独立 FxCop 10 的调用包含为构建后事件。优点:每次编译都发生在每个重建的项目中。缺点:必须采取额外措施来确保新项目有此规定

  • 创建一个新项目,或标识一个现有项目,由于其项目依赖性,该项目始终是最后构建的。给(仅)该项目一个 Post-build 事件,该事件在(公共)输出文件夹中的所有程序集上运行 FxCop。优点:只需更新一个文件,未来项目未经分析的可能性较小。缺点:构建依赖的变幻莫测可能意味着这实际上不起作用

  • 使用在任何构建后运行 FxCop 的加载项或宏更新所有开发人员的 VS 实例。根本不喜欢这个主意。

还有其他选择,明显优于上述任何一种吗?进行上述其中一项工作时,我是否需要注意任何警告或观察?

我还希望 FxCop 作为MSBuild 4.0 驱动的构建的一部分在构建服务器上运行。哪些选项允许我在桌面编译和 bulid 服务器编译之间重用代码分析规则集?


我已经阅读了相关但不相同的已有问题,包括:

【问题讨论】:

  • 呸。升级你的许可证,这些东西只有在你的时间一文不值的情况下才有意义。

标签: visual-studio-2010 msbuild code-analysis fxcop


【解决方案1】:

为了将 FxCop 集成为构建脚本 (MSBuild) 的一部分,我使用来自 MSBuild.Community.Tasks 的 FxCop 任务。我使用 FxCop 创建了一个 FxCop 项目 (FxCopProject.FxCop),它定义了要使用的规则和要检查的程序集。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup>
  <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\vendor\MSBuild.Community.Tasks.v1.3.0.504</MSBuildCommunityTasksPath>
  <FxCopDir>vendor\Microsoft Fxcop 10.0</FxCopDir>
 </PropertyGroup>
 <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets"/>

 <Target Name='FxCopReport'>
  <FxCop
   ToolPath='$(FxCopDir)'
   ProjectFile='FxCopProject.FxCop'
   AnalysisReportFileName='FxCopReport.xml'
  />
 </Target>
</Project>

【讨论】:

    【解决方案2】:

    我使用Hudson 作为构建服务器,在构建 .NET 应用程序后执行代码分析。为了将其用于此目的,您需要安装两个插件:

    • MSBuild 用于构建 .NET 应用程序的插件。
    • Violations 报告代码分析结果并支持 FxCop 和 StyleCop 的插件。

    Hudson 需要配置为执行 FxCop 和 StyleCop,但使用批处理文件并不难做到这一点。好处是不需要配置任何项目文件,因为代码分析将在外部执行;也就是说,不是通过 Visual Studio。

    您可以将 Hudson 配置为将代码分析作为日常任务执行,甚至可以在应用程序的每次更改时执行。然后你的开发团队中的每个人都可以通过 Hudson 查看代码分析结果,以确定他们是否有任何违规行为。

    【讨论】:

      【解决方案3】:

      我有一段时间没有使用 FxCop,但是如果您有很多项目,我怀疑为每个项目运行一次,而不是最后只运行一次,会很痛苦。你可以尝试(或至少从)this 之类的东西。简而言之,您有一个超级项目,其目标取决于构建整个解决方案,然后运行 ​​FxCop(或单元测试等)。您使用解决方案资源管理器中的批处理文件调用超级项目。

      它类似于您的第二个建议,但不会依赖于构建顺序,并且不需要摆弄新项目。不幸的是,它当前的化身打破了从 VS 内部构建的正常快捷方式,并且可能很容易意外绕过,但可能会对其进行改进。

      使用 MSBuild 目标来运行 FxCop,而不是构建后步骤,与 VS 集成可能会更简洁和更好。

      【讨论】:

        【解决方案4】:

        FxCop 的替代方法是使用 NDepend 工具,它可以编写Code Rules over C# LINQ Queries (namely CQLinq)免责声明:我是该工具的开发人员之一

        默认建议超过200 code rules。得益于众所周知的 C# LINQ 语法,自定义现有规则或创建自己的代码规则非常简单。

        可以在live in Visual Studio 和构建过程中验证规则,在generated HTML+javascript report 中。

        【讨论】:

          【解决方案5】:

          创建自定义构建活动(基于我们通过构建定义设置的属性运行):

          1. 我的自定义活动搜索根文件夹下的所有 *.csproj 文件。
          2. 更新所有 csproj 文件以添加属性“

            是的

          3. 保存 csproj 文件。

          4. 现在这将导致您在编译时运行代码分析。

          这意味着我们可以控制何时需要运行代码分析。我们不必每次构建代码时都运行它。

          只是读到您没有高级 VS,但您可以按照相同的过程在构建期间更新 csproj 文件发布事件。

          【讨论】:

            【解决方案6】:

            我知道这是一个老问题,但 IMO 的最佳选择是使用 SonarQube 和 C# 插件来进行分析。这会将 FxCop 作为分析选项之一进行处理,并且能够进行 StyleCop 和 ReSharper 分析(使用免费的命令行运行程序)并编译到一个 Web 界面中。

            设置第一个项目确实需要一些时间,但设置后续项目非常相似,可以由您的 CI 服务器触发。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-14
              • 2011-10-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多