【问题标题】:Use code analysis with Visual Studio DNX project (.xproj)使用 Visual Studio DNX 项目 (.xproj) 进行代码分析
【发布时间】:2015-11-15 20:45:55
【问题描述】:

在“普通”Visual Studio 项目 (.csproj) 的属性中,可以说 Enable Code Analysis on Build(以前称为 FxCop)。

自从我开始使用新的 DNX 项目 (.xproj) 以来,我正在寻找类似的东西。我知道可能没有构建输出,所以旧方法可能不适合这个,但我很确定代码分析/FxCop 规则仍然适用。此外,应该有一些方法可以在新的“实际”项目文件 (project.json) 中注册自定义规则集 (.ruleset) 文件。

也许我忽略了基于 Roslyn 之类的更现代的东西?

【问题讨论】:

  • 我认为这个github.com/aspnet/dnx/issues/2311 是必需的。
  • 啊,看来这个问题可以用beta7(最早)得到答案。
  • 它不在 beta7 中,目前未分配给里程碑...
  • @OhadSchneider 不。仍然有一个 open issue 可以在 .NET Core 项目上启动并运行基于 Roslyn 的新 FxCop 规则。根据最新的 cmets,我们将不得不等待 .NET Core 1.1,这无论如何都会导致 .xproj 的消亡。 :便便:
  • @OhadSchneider 请在下面查看我的回答 :)

标签: visual-studio visual-studio-2015 asp.net-core code-analysis .net-core


【解决方案1】:

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

更新

xproj 现在支持StyleCop.Analyzers

【讨论】:

  • 感谢您的信息!我只是投了赞成票,因为它并没有真正解决这个问题。
  • .net 核心现在是 1.0.1,仍然没有任何静态分析工具的迹象。
  • @WarrenP StyleCop.Analyzers 静态分析工具使用变通方法工作。其他人将不得不等待 xproj 到 csproj 移动。
  • 无论是在 IDE 中还是从命令行批处理文件中,我都无法使解决方法发挥作用。
  • @WarrenP 我整个星期都在使用它,它确实 100% 有效。
【解决方案2】:

终于找到了一种解决方法,在他们(希望)用下一个版本的 .NET Core 和 Visual Studio 修复它之前,应该可以解决这个问题。诀窍是为经典的 .NET Framework 构建执行“旧的”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%"
  }
 }

“应用程序”的 project.json 应包含实际运行时:

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

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

  • 代码分析.cmd
  • CodeAnalysis.ruleset
  • CodeAnalysis.xml(字典)

批处理文件“支持”当前的 .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

它不像普通的内置东西那么方便,但是使用Visual StudioFxCop的错误/警告出现在错误列表中 em>(有时需要进行第二次构建)。但它们不会导致构建失败(也许还有其他技巧……)。

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>

【讨论】:

  • 这太棒了,而且确实有效!但是有一个问题:在我的情况下,编译常量由于某种原因没有得到评估,例如当从 project.json 传递 %compile:TargetFramework% 时,批处理脚本接收字符串 %compile:TargetFramework% 而不是实际值。有什么想法吗?
  • 不,没有这个问题。您是否使用“postcompile”以外的其他事件?
  • 啊,你是对的,我使用的是“postbuild”。但是,“后编译”似乎并未被识别为有效事件。你需要"NETStandard.Library": "1.6.0"吗?
  • 这更可能取决于所使用的工具。我认为“较旧”的 dnu/dnx 工具有一个 postbuild 脚本,而“较新”的 dotnet 工具(我的机器上的版本 1.0.0-preview2-003131)提供了一个 postcompile 事件。
  • 你说得对,我的版本是1.0.0-rc1,显然太旧了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 2021-06-24
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多