使用 Visual Studio DNX 项目 (.xproj) 的代码分析

Use code analysis with Visual Studio DNX project (.xproj)

在 "ordinary" Visual Studio 项目 (.csproj) 的属性中,可以说 在构建时启用代码分析(以前称为 FxCop) .

自从我开始研究新的 DNX 项目 (.xproj) 以来,我一直在寻找类似的东西。我知道可能没有构建输出,所以旧方法可能不适合这种情况,但我很确定代码分析/FxCop 规则仍然适用。此外,应该有一些方法可以在新的 "actual" 项目文件 (project.json).

中注册自定义规则集 (.ruleset) 文件

也许我忽略了一些基于 Roslyn 等的更现代的东西?

在 ASP.NET 工具 GitHub 网站 here 上存在一个问题。它目前不受支持,但有望很快得到实施。当从 xproj 切换回 csproj 时,代码分析将再次工作。

更新

StyleCop.Analyzers 现在支持 xproj。

终于找到了一个解决方法,在他们(希望)用下一版 .NET Core 和 Visual Studio 修复它之前应该这样做。诀窍是为经典 .NET Framework 构建执行 "good old" FxCop,这是 运行 老式代码分析所必需的。

图书馆的 project.json 应该包含类似的内容:

{
  "frameworks": {
    "net46": {
      "buildOptions": {
        "define": [ "CODE_ANALYSIS" ]
      }
    },
    "netstandard1.3": {
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      }
    }
  },

  "scripts": {
    "postcompile": "../../CodeAnalysis.cmd %compile:TargetFramework% %compile:Configuration% %compile:OutputFile% %compile:CompilerExitCode%"
  }
 }

"apps" 的 project.json 应该包括实际的 运行 时间:

{
  "scripts": {
    "postcompile": "../../CodeAnalysis.cmd %compile:TargetFramework% %compile:Configuration% %compile:OutputFile% %compile:CompilerExitCode% %compile:RuntimeOutputDir%"
  }
 }

因此,使用 postcompile 事件可以 运行 某种批处理脚本来执行经典的 FxCop (需要 Visual Studio!)。我目前正在使用包含三个文件的设置:

  • CodeAnalysis.cmd
  • CodeAnalysis.ruleset
  • CodeAnalysis.xml(字典)

批处理文件 "supports" 当前 .NET Framework 4.6 版本,如下所示:

@echo off

if not [%4]==[0] (
  goto :eof
)

if not [%2]==[Release] (
  goto :eof
)

if [%1]==[net46] (
  set VERSION=v4.6
) else if [%1]==[net461] (
  set VERSION=v4.6.1
) else if [%1]==[net462] (
  set VERSION=v4.6.2
) else (
  goto :eof
)

if not [%5]==[] (
  set FILE=%5\%~nx3
) else (
  set FILE=%3
)

set PLATFORM=%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\%VERSION%
set DIRECTORY=%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\%VERSION%\Facades

set FXCOP=%VS140COMNTOOLS:Common7\Tools=Team Tools\Static Analysis Tools\FxCop%FxCopCmd.exe
set RULES=%VS140COMNTOOLS:Common7\Tools=Team Tools\Static Analysis Tools\FxCop%Rules

"%FXCOP%" /platform:"%PLATFORM%" /directory:"%DIRECTORY%" /rule:"-%RULES%" /ruleset:"=%~dp0CodeAnalysis.ruleset" /dictionary:"%~dp0CodeAnalysis.xml" /file:"%FILE%" /ignoregeneratedcode /console /culture:de-DE

它不像普通的内置东西那么方便,但是 FxCop 的错误/警告出现在 错误列表 中使用 Visual Studio(有时需要第二次构建)。尽管它们不会导致构建失败(也许还有另一个技巧...)。

CodeAnalysis.ruleset 示例:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="All Rules, except a few ones" ToolsVersion="14.0">
    <IncludeAll Action="Error" />
    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
        <!-- CLS compliant -->
        <Rule Id="CA1014" Action="None" />
        <!-- COM visibility -->
        <Rule Id="CA1017" Action="None" />
    </Rules>
</RuleSet>